如何立即返回Apache Camel Servlet请求?

时间:2017-01-09 15:18:57

标签: java asynchronous apache-camel background-process

我想要一个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'

任何想法我做错了什么?

3 个答案:

答案 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没有发布它们......