执行人服务不会超时,并继续运行
问题描述:
我有以下代码:执行人服务不会超时,并继续运行
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()
}
}
我使用Twitter4J访问Twitter的API.I想写鸣叫文件2分钟,然后停止。
stream.filter(fq)
方法即使在规定的2分钟后仍然运行,并且永远不会达到TimeoutException。我想在2分钟后,异常将被捕获,我可以结束该方法,但这不会发生。
答
您对TwitterStream的工作原理有错误的心智模式,也很可能是标准java Future
和ExecutorService
的工作原理。
TwitterStream不适用于您提供给它的任何线程。 TwitterStream .filter
内部开始新的线程,你可以在https://github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L317和https://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
请张贴[MCVE。这段代码甚至不会编译。 –
@AndyTurner,您将需要Twitter API密钥才能运行代码 – kulsoompatel