1

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つのアプローチの違いは何ですか?!

4

0 に答える 0