Twitter用のSteamingAPIを実装しました。私はストリームを完全に取得します。しかし、私のプログラムは決して終わりません。多くの組み合わせを試しましたが、理由がわかりません。私はJavaでApacheAsyncHttpClientを訴えています。私の目標は、たとえば10秒間ストリームを開始し、ストリームを取得し、ストリームを正常に閉じてアプリケーションを終了することです(これは、Mainメソッドが自然に終了したときに発生することを期待しています)。これは以下のコードです:
public static void main(String[] args) throws Exception
{
TwitterStreamingHttpClient client = new TwitterStreamingHttpClient();
Executor ex = Executors.newSingleThreadExecutor();
ex.execute(client);
Thread.sleep(5000);
client.ceaseStream();
LOG.debug("Keeps running");
}
この:
public class TwitterStreamingHttpClient extends DefaultHttpAsyncClient implements Runnable
{
private final static Logger LOG = LoggerFactory.getLogger(TwitterStreamingHttpClient.class);
/**
* @throws IOReactorException
*/
public TwitterStreamingHttpClient() throws IOReactorException
{
super();
// TODO: parametrize it, load from config file, spring config file?
this.getCredentialsProvider().setCredentials(new AuthScope("stream.twitter.com", 80),
new UsernamePasswordCredentials("username", "password"));
this.start();
}
public void initiateStream() throws UnsupportedEncodingException, InterruptedException, ExecutionException
{
String requestContent = new String();
requestContent = "track=NothingFeelsBetterThan";
Future future = this.execute(HttpAsyncMethods.createPost(
"https://stream.twitter.com/1.1/statuses/filter.json", requestContent,
ContentType.APPLICATION_FORM_URLENCODED), new TwitConsumer(), null);
Boolean result = future.get();
if(result==null)
{
LOG.error("Requested to close stream!");
return;
}
}
public void ceaseStream()
{
try
{
this.shutdown();
LOG.info("Shutting down the stream");
}
catch (InterruptedException e)
{
LOG.debug("InterruptedException {}", e);
}
}
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run()
{
Thread.currentThread().setName("initiateSTream Thread");
try
{
initiateStream();
Thread.currentThread().interrupt();
}
catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ExecutionException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
役に立つかもしれませんが、どこにでも返品を追加しようとしました。しかし、運はありません。誰かがこれを手伝ってくれますか?
編集1:デバッグモードを使用すると、「initiateSTreamThread」スレッドが表示されます。メインスレッドがなくなっている間、まだ実行中です!
編集2(解決策):メインの方法で、私は置き換えました:
Executor ex = Executors.newSingleThreadExecutor();
ex.execute(client);
と:
Thread thread = new Thread(client);
thread.start();
これで、指定されたストリーミング時間の後にプログラムが終了します。しかし、なぜ?2つのアプローチの違いは何ですか?!