0

我们的应用程序中有以下骆驼路线:

    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)。

4

1 回答 1

1

您可以将 .sendBody(importUri, body) 替换为 .asyncSendBody(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;
    }
}
于 2013-12-10T16:56:31.747 回答