/ / Twitter4j Stream Shutdown - scala, twitter, stream, twitter4j

Twitter4j Stream Shutdown - scala, twitter, stream, twitter4j

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 № 1

Bit, 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)