Używam strumienia z Twittera do próbkowanianiektóre filtrowane tweety. Chcę jednak wyodrębnić tylko niewielki zestaw tweetów, więc używam czasu do kontrolowania, kiedy zamykam strumień. Tymczasem piszę do pliku. Jednak dopóki nie zamknę programu, strumień będzie kontynuowany i nie zostanie zamknięty. Jakieś powody dlaczego? Używam do tego scala, oto mój kod:
def simpleStatusListener = new StatusListener() {
def onStatus(status: Status) {
appendToFile("/tmp/stream.txt",status.getText)
}
def onDeletionNotice(statusDeletionNotice: StatusDeletionNotice) {}
def onTrackLimitationNotice(numberOfLimitedStatuses: Int) {}
def onException(ex: Exception) { ex.printStackTrace }
def onScrubGeo(arg0: Long, arg1: Long) {}
def onStallWarning(warning: StallWarning) {}
}
val twitter = new TwitterFactory().getInstance
twitterStream.addListener(simpleStatusListener)
val now = System.nanoTime
if((System.nanoTime-now)/1000000 > 10){
twitterStream.cleanUp
twitterStream.shutdown
}
Odpowiedzi:
2 dla odpowiedzi № 1Bit, w którym zamykasz strumień, najprawdopodobniej zostanie wykonany natychmiast po linii, w której obliczasz now
zmienna. Jest więc bardzo mało prawdopodobne, że warunek if (System.nanoTime-now)/1000000 > 10
wytrzyma. Oto rozwiązanie:
def simpleStatusListener = new StatusListener() {
def onStatus(status: Status) {
appendToFile("/tmp/stream.txt",status.getText)
}
def onDeletionNotice(statusDeletionNotice: StatusDeletionNotice) {}
def onTrackLimitationNotice(numberOfLimitedStatuses: Int) {}
def onException(ex: Exception) { ex.printStackTrace }
def onScrubGeo(arg0: Long, arg1: Long) {}
def onStallWarning(warning: StallWarning) {}
}
val twitter = new TwitterFactory().getInstance
twitterStream.addListener(simpleStatusListener)
//scheduling the closing of the stream
val interval = 10 * 1000000
val timer = new Timer()
val cancelTask = new TimerTask {
def run() {
twitterStream.cleanup()
twitterStream.shutdown()
}
}
timer.schedule(cancelTask, interval)