다음 코드가 있습니다.
def getIndustryData(String[] theIndustries) {
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter("result.txt")))
//Listens to Twitter statuses and carries out the following methods on the status
StatusListener listener = new StatusListener() {
@Override
void onStatus(Status status) {
printWriter.write(status.getLang() + "|||" + status.getText())
printWriter.println()
}
@Override
void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
}
@Override
void onTrackLimitationNotice(int numberOfLimitedStatuses) {
}
@Override
void onScrubGeo(long userId, long upToStatusId) {
}
@Override
void onStallWarning(StallWarning warning) {
}
@Override
void onException(Exception ex) {
}
}
TwitterStream stream = new TwitterStreamFactory().getInstance()
stream.addListener(listener)
FilterQuery fq = new FilterQuery()
fq.track(theIndustries)
ExecutorService executor = Executors.newSingleThreadExecutor()
Future<String> future = executor.submit(new Callable<String>() {
@Override
String call() throws Exception {
stream.filter(fq)
return null
}
})
try {
future.get(2, TimeUnit.MINUTES)
} catch (TimeoutException e) {
stream.removeListener(listener)
stream.shutdown()
future.cancel(true)
executor.shutdownNow()
}
}
Twitter API에 접근하기 위해 Twitter4J를 사용하고 있는데, 2 분 동안 파일에 트윗을 쓴 후 중지하고 싶습니다.
이 stream.filter(fq)
메서드는 명시된 2 분 후에도 실행되고 TimeoutException에 도달하지 않습니다. 2 분 후에 예외가 잡힐 것이라고 생각하고 방법을 끝낼 수 있지만 이것은 발생하지 않습니다.
TwitterStream이 작동하는 방식과 표준 Java Future
및 ExecutorService
작동 방식에 대한 잘못된 정신 모델이 있습니다.
TwitterStream은 귀하가 제공하는 스레드에서 작동하지 않습니다. https://github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L317 및 https : //TwitterStream .filter
의 소스에서 볼 수 있듯이 내부적으로 새 스레드를 시작합니다 . github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L516
또한 Future.get
시간 초과 방법은 TimeoutException
. 작업이 빠르면 값만 반환합니다. 그리고 이것이 바로 당신의 경우입니다! 빠른 stream.filter(fq)
새로운 Thread
것을 만들고 당신의 미래는 즉시 돌아옵니다 null
.
작동하는 가장 간단한 방법 (아마도 최선은 아님)은 다음과 같습니다.
stream.filter(fq)
try
{
Thread.sleep(2 * 60 * 1000); // just sleep on the caller thread
}
catch (InterruptedException e)
{
// ignore
}
stream.removeListener(listener)
stream.cleanup()
//stream.shutdown() //don't think you really need shutdown, cleanup seems to be enough
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다