0

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 要求/応答に対する要求と応答は、それらを同時に実行できるようにするのではなく、シリアル化するように思われるため、より優れたアーキテクチャ アプローチに関する提案も大歓迎です。

4

1 に答える 1