我想要一个Apache Camel Servlet的请求立即返回,但是继续在"背景中处理请求"线。我已经尝试了几件事,但似乎在返回之前它仍然处理很多。
from("servlet://my-endpoint")
.threads()
.process(exchange -> {
exchange.getOut().setBody(doStuff(exchange.getHeaders()))
})
.multicast()
.parallelProcessing()
.recipientList(constant("direct:a,direct:b,direct:c"), ",")
.ignoreInvalidEndpoints()
.transform()
.constant("OK");
我使用curl进行测试:
curl 'http://localhost:4000/my-app/camel/my-endpoint' -X POST --data 'myVar=bar&myOtherVar=foo'
任何想法我做错了什么?
答案 0 :(得分:3)
因为你使用组播主线程正在等待响应。
你只是在不同的线程中做你的东西,但是在同步模式下。 如果您想使它完全异步,请在最开始时将wireTap用于另一个路由端点。
伪码逻辑:
main route:
from-> wireTap exchange ->to(process_endpoint) -> set immediate response.
process route: from(process_endpoint) -> do all stuff -> stop route.
答案 1 :(得分:1)
camel servlet支持异步模式,看看驼峰文档 http://camel.apache.org/servlet.html 使用Servlet 3.0异步模式
使用wireTap也是另一种选择。 http://camel.apache.org/wire-tap.html
答案 2 :(得分:1)
我使用hint代替ProducerTemplate。事实证明它很有效:
from("servlet://my-endpoint")
.process(exchange -> {
Map body = doStuff(exchange.getIn().getHeaders()));
ProducerTemplate template = exchange.getContext().createProducerTemplate();
Arrays.asList("direct:a", "direct:b", "direct:c")
.forEach(endpoint -> template.asyncSendBody(endpoint, body));
});
编辑:警告!在生产中使用asyncSendBody之后,机器很快就退出了PID。我必须弄清楚为什么Camel没有发布它们......