0

Apache Camel 2.13.1 宁 async-http-client 1.7.19

我试图了解是否可以将回复请求模式与 Camel 和 Ning async-http-client 一起使用,以便路由阻塞直到收到 HTTP 响应。(“如果你想阻塞直到收到响应,为什么要使用异步客户端呢?”你可能会问。不完全是我的选择;但显然它以前被发现是我工作的最可靠的 http 客户端,并且这正是我们现在使用的。)

所以我有一个看起来像这样的骆驼设置:

<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

1

bean 组件不支持骆驼路由中的aysnc API。为什么不直接使用camel-ahc组件呢?它基于 async-http-client。

于 2014-11-03T01:18:41.810 回答