Apache Camel 2.13.1 寧 async-http-client 1.7.19
HTTP 応答を受信するまでルートがブロックされるように、Camel と Ning async-http-client で応答要求パターンを使用できるかどうかを理解しようとしています。(「応答を受信するまでブロックしたいのに、なぜ非同期クライアントを使用しているのですか?」と尋ねるかもしれません。完全に私の選択ではありませんが、明らかに、私が働いていて、それが現在使用されているものです。)
したがって、次のようなラクダのセットアップがあります。
<camel:camelContext id="camelContext">
<camel:package>com.lijit.blackbird</camel:package>
<camel:threadPoolProfile id="selectionPool" poolSize="100" maxPoolSize="512" maxQueueSize="-1" />
<camel:route id="delivery">
<camel:from uri="direct:start" />
<camel:to uri="direct:select" />
<camel:to uri="direct:resolve" />
<camel:to uri="direct:finalStep" />
</camel:route>
<camel:route id="select">
<camel:from uri="direct:select" />
<camel:multicast executorServiceRef="selectionPool">
<camel:to uri="selectorType1" />
<camel:to uri="selectorType2" />
...
<camel:to uri="selectorTypeN" />
</camel:multicast>
</camel:route>
<camel:route id="resolve">
<camel:from uri="direct:resolve" />
<camel:split stopOnException="false" parallelProcessing="true">
<camel:method bean="myResolutionSplitter" />
<camel:to uri="bean:contentFetchingAsyncHttpClient" />
</camel:split>
</camel:route>
</camel:camelContext>
発生していることの要点は、一部の「セレクター」のセットが「もの」を選択することです。上記のものには、一部のコンテンツを取得できる URL が含まれています。このように、メッセージは「解決」(よりわかりやすく言うと、コンテンツのフェッチ) を必要とする URL ごとに分割されます。
このコンテンツのフェッチは、この Ning async-http-client を使用して行われます。コードは基本的に次のようになります。
public class ContentFetchingAsyncHttpClient extends AsyncCompletionHandler<Response> {
private Future<Response> future;
private final AsyncHttpClient httpClient;
...
@Handler
public void fetch(URL url) {
Request request = new RequestBuilder()
.setMethod("GET")
.setUrl(url.toExternalForm())
.build();
future = httpClient.executeRequest(request, this);
}
@Override
public Response onCompleted(Response response) { /* do stuff with fetched content */ }
}
したがって、私の問題は次のとおりです。fetch()
メソッドは、メッセージが分割された各 URL に対して HTTP 要求を送信します。応答が受信される前に戻るためfetch()
、すべての要求が行われると、取得したコンテンツが実際に必要な Camel ルートに進みfinalStep
ますが、実際にはまだ戻っていません。
ここではリクエスト/リプライ パターンが役立つのではないかと考えていましたが、例はすべて JMS 指向のようで、bean/POJO の世界にどのように変換すればよいかわかりません。onCompleted()
メソッドが何らかの方法で「返信」する必要があると想像していました。具体的な提案は大歓迎です!
さらに、今これを入力しましたが、とにかくこれが正しいパターンであるかどうかはわかりません。私が本当に達成したいのは、同時に発生する n 個の HTTP 要求と、それらすべてが完了したときにのみルートが進行することです。http 要求/応答に対する要求と応答は、それらを同時に実行できるようにするのではなく、シリアル化するように思われるため、より優れたアーキテクチャ アプローチに関する提案も大歓迎です。