2017-03-16 6 views
0

私は、次のコードを持っている:私は2分間のファイルへのつぶやきを書き込み、その後、停止したいTwitterのAPI.IにアクセスするにはTwitter4Jを使用していますエグゼキュータ・サービスはタイムアウトし、実行を継続していません

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() 

      } 
     } 

stream.filter(fq)メソッドは、指定された2分後に実行され、TimeoutExceptionには決して達しません。私は2分後に例外がキャッチされると思っていましたが、私はこのメソッドを終了することができましたが、これは起こりません。

+0

のようなものである

最も簡単な(最高おそらくない)は、[MCVE]を投稿してください。このコードはコンパイルされません。 –

+0

@AndyTurner、コードを実行するにはTwitter APIキーが必要です – kulsoompatel

答えて

0

TwitterStreamの仕組みや、標準のJava FutureExecutorServiceの仕組みの考え方が間違っています。

あなたが提供するスレッドでは、TwitterStreamは動作しません。 TwitterStream .filterはタイムアウトメソッドがTimeoutExceptionで失敗することが保証されていないとあなたが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でソースで見ることができるように内部的に新しいスレッドを開始します。ジョブが高速の場合は、単に値を返します。これはまさにあなたのケースです! 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 
関連する問題