2017-03-16 29 views
0

我有以下代码:执行人服务不会超时,并继续运行

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分钟后,异常将被捕获,我可以结束该方法,但这不会发生。

+0

请张贴[MCVE。这段代码甚至不会编译。 –

+0

@AndyTurner,您将需要Twitter API密钥才能运行代码 – kulsoompatel

回答

0

您对TwitterStream的工作原理有错误的心智模式,也很可能是标准java FutureExecutorService的工作原理。

TwitterStream不适用于您提供给它的任何线程。 TwitterStream .filter内部开始新的线程,你可以在https://github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L317https://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