2017-12-24 40 views
0

スレッドごとに複数の呼び出しを実行するために、非同期http呼び出しを行うためにapache async httpクライアントを使用します。コールバックからGuava ListenableFutureを取得する方法は?

コードは以下のとおりです:https://hc.apache.org/httpcomponents-asyncclient-dev/quickstart.html

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault(); 

// Start the client 
httpclient.start(); 

// One most likely would want to use a callback for operation result 
final CountDownLatch latch1 = new CountDownLatch(1); 
final HttpGet request2 = new HttpGet("http://www.apache.org/"); 
httpclient.execute(request2, new FutureCallback<HttpResponse>() { 

    public void completed(final HttpResponse response2) { 
     latch1.countDown(); 
     System.out.println(request2.getRequestLine() + "->" + response2.getStatusLine()); 
    } 

    public void failed(final Exception ex) { 
     latch1.countDown(); 
     System.out.println(request2.getRequestLine() + "->" + ex); 
    } 

    public void cancelled() { 
     latch1.countDown(); 
     System.out.println(request2.getRequestLine() + " cancelled"); 
    } 

}); 
latch1.await(); 

私はnodejsでプログラムし、約束のアプローチにはとても満足だった最後の時間では。私が見つけた最も近いアイテムは、GUAVAのListenableFutureでした。 (私はJava 8を使用できません)。問題は、コールバックのアプローチをListenableFutureに変換する方法です。

これはコールバックで私は単に解決機能を呼び出すことができるので、これは簡単です。私はJavaでこれを行う方法を認識していないと私はこれを行う方法をGoogleで見つけられませんでした。

+0

わかりません。未来を処理したくない場合はコールバックを使用しており、将来使用する場合はコールバックは必要ありません。 Guavaのコールバックの仕組みは、将来的に静的に登録されているため、あなたが使用しているHttpライブラリがあなたから隠している場合、未来を手に入れることはできません。なぜ、最初に未来が必要なのですか? (申し訳ありませんが、なぜ迷惑なのですが、何を達成したいのか不明です) –

+0

私の使用例は、コールバックスタイルで書かれた既存のコードを使いたいということです。私はコールバックが嫌いで、代わりにlistenablefuturesを使いたい。問題はこれを達成する方法です。 –

答えて

0

次のポストは非常に有用だった:私がやりたい何Turning a listener into a future in java は:API状態として

// One most likely would want to use a callback for operation result 
final SettableFuture<String> future = SettableFuture.create(); 
final HttpGet request2 = new HttpGet("http://www.apache.org/"); 
httpclient.execute(request2, new FutureCallback<HttpResponse>() { 

    public void completed(final HttpResponse response2) { 

     future.set(request2.getRequestLine() + "->" + response2.getStatusLine()); 
    } 

    public void failed(final Exception ex) { 
     future.set(request2.getRequestLine() + "->" + ex); 
    } 

    public void cancelled() { 

     future.set(request2.getRequestLine() + " cancelled"); 
    } 

}); 
1

、今後はexecuteメソッドによって返されます。それはコールバックにリンクされているので、それはそう

ListenableFuture<HttpResponse> future = (ListenableFuture<HttpResponse>) httpclient.execute(...); 

はトリックを行う必要がありListenableFutureでなければなりません(コールバックの中に、あなたがそれを行うことはできません)。技術的には、将来をキャストする必要はありません。通常の未来はあなたのユースケースに十分であるはずです。なぜなら、コールバックをもっと必要としないからです。

コールバックを完全に取り除きたい場合は、HttpClientの別の実装を使用する必要がありますが、コードを書き直す必要があります。

コールバックの内部では、未来を得ることができず、将来の結果がコールバックの引数なので、それは必要ありません。

+0

私はListenableFutureを取得したいのですが、より複雑な変換を行うことができます。また、答えを得るためにスレッドをブロックする必要があります。 future.getがブロックしています。 https://github.com/google/guava/wiki/ListenableFutureExplainedこれ以外にも、将来を聴くことができないようにすることはできません。それのための機能があります。 –

+0

executeメソッドの結果を十分にキャストしているか、別のものが必要ですか? –

+0

キャストできません。未来からlistenablefutureを得る唯一の方法は、getコールで専用のスレッドをブロックすることです。これはうまくありません。 –

関連する問題