服务激活器EIP的异步变化?

时间:2013-12-10 14:55:16

标签: spring apache-camel enterprise-integration

我们的申请中有以下Camel路线:

    from(webServiceUri).routeId("webServiceRoute")
        .unmarshal(jaxb)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                final Message in = exchange.getIn();
                final DataRequest body = in.getBody(DataRequest.class);
                final DataRequest.Items items = body.getItems();
                itemValidator.validate(items.getItem());
                getContext().createProducerTemplate().sendBody(importUri, body);
                DataResponse response = new DataResponse();
                response.setReturnCode(ReturnCode.SUCCESS);
                in.setBody(response);
            }
        })
        .marshal(jaxb);

我们希望“webServiceRoute”在处理器验证数据并将消息转发到“importUri”后立即返回响应用户。但是现在似乎在“importUri”交换完成之前,响应不会返回给调用者。所以我的问题是将收到的请求异步转发到另一个队列的“正确”方法是什么? “importUri”交易所不会有任何回复(即它应该是InOnly)。

1 个答案:

答案 0 :(得分:1)

您可以用.asyncSendBody(importUri,body)替换.sendBody(importUri,body)。

尽管如此,我发现您的路线对我来说很奇怪,为什么要使用处理器来转发您的信息。我会写一些类似的东西:

DataResponse successResponse = new DataResponse();
response.setReturnCode(ReturnCode.SUCCESS);

from(webServiceUri).routeId("webServiceRoute")
    .unmarshal(jaxb)
    .bean(WebServiceRouteHelper.class,"validate")
    .to(importUri)
    .setBody(constant(sucessResponse))
    .marshal(jaxb);

class WebServiceRouteHelper {
    public DataRequest validate(DataRequest dataRequest) throws Exception {
        final DataRequest.Items items = body.getItems();
        itemValidator.validate(items.getItem());
        return dataRequest;
    }
}