5

全て、

アプリケーションに NodeJS と Java のどちらを使用するかを決定しようとしています。HTTP 経由で CouchDB と通信する予定であり、アプリケーション スレッドが CouchDB からのクエリ応答を待機している間に追加の要求を処理できる、非同期のノンブロッキング設計が必要です。

私は Java を使用したいと考えており、潜在的な解決策として数日間 AsyncHttpClient を検討しています。ただし、ライブラリを理解するのに苦労しており、根本的な誤解があるのではないかと思います。

私はここに要旨を投稿しました: https://gist.github.com/conorgil/5505603

この要点が「リクエストXが送信されました!」と出力されることを期待しています。および各リクエストの「レスポンス X: 何か」。ただし、各 Future が get() を呼び出すまで、HTTP 呼び出しは行われない (したがって、ハンドラーは実行されない) ようです。23 行目の f.get() のコメントを外すと、コードは期待どおりに機能しますが、Future#get() の呼び出しがブロックされていますね。HTTP 応答がブロックせずに完全に取得されると実行されるコールバック関数を提供する方法はありますか?

次のようなものです: 1) リクエストがメイン スレッドに着信します。2) 非同期でノンブロッキングの HTTP 呼び出しが CouchDB に対して行われます。CouchDB からの応答を処理するために、完了ハンドラーが登録されます。 3) メイン スレッドは、次の要求を処理するために自由になります。リクエストの処理のみ (CouchDB をヒットする必要のないリクエストの場合、非常に迅速に応答できます)

ここで何かを根本的に誤解していますか?Javaでこの種のことを行うことは可能ですか? AsyncHttpClient が答えですか? この質問は関連していますが、2011年以降に変更があったかどうかはわかりません ( Perform Async Connect with Java AsyncHttpClient Library? )

NodeJS はイベント ループを実行するため、このノンブロッキングの非同期動作は標準です。コールバック関数を登録して DB 応答を受信したときにそれを処理するだけで、イベント ループはその間に他のことを処理するだけです。

あらゆるアドバイスをいただければ幸いです。

ありがとう、コナー

4

2 に答える 2

3

AsyncHttpClient の主な目的は非ブロック HTTP であり、私はそれをうまく使用してその効果を上げました。たとえば、私はあなたのコードのこの簡略化されたバージョンを実行しました:

public class MyAsyncHttpClientTest {
  public static void main(String[] args) throws Exception {
    AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
    for (int i = 0; i < 10; i++) {
      asyncHttpClient.prepareGet("http://www.google.com")
        .execute(new CompletionHandler(i));
      System.out.println(String.format("Request %d sent! ", i));
      System.out.flush();
    }
  }
  static class CompletionHandler extends AsyncCompletionHandler<Void> {
    private final int reqNumber;
    public CompletionHandler(int reqNumber) { this.reqNumber = reqNumber; }
    @Override public Void onCompleted(Response response) throws Exception {
      System.out.println(String.format("Response %d: %s", reqNumber,
          response.getResponseBody()));
      return null;
    }
  }
}

先物が含まれていないことに注意してください。予想どおり、次の出力が生成されます。

Request 0 sent! 
Request 1 sent! 
Request 2 sent! 
Request 3 sent! 
Request 4 sent! 
Request 5 sent! 
Request 6 sent! 
Request 7 sent! 
Request 8 sent! 
Request 9 sent! 
Response 1: <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.hr/">here</A>.
</BODY></HTML>

Response 0: <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.hr/">here</A>.
</BODY></HTML>

...

唯一の問題は、クライアントをシャットダウンするコードがないため、プロセスがハングしたままになることですが、それは別の話です。

于 2013-05-06T12:18:07.937 に答える