2017-01-09 59 views
0

我想要一个Apache Camel Servlet立即返回的请求,但在“后台”线程中继续处理请求。我已经尝试了几件事情,但它似乎在返回之前仍然处理很多。如何使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

因为您使用多播主线程正在等待响应。

你只是做你的东西在不同的线程,但在同步模式。 如果您想使其完全异步,请在一开始就使用wireTap到另一个路由端点。

伪代码逻辑:

main route: 
     from-> wireTap exchange ->to(process_endpoint) -> set immediate response. 
process route: from(process_endpoint) -> do all stuff -> stop route.  
0

我使用ProducerTemplate代替hint。原来它很好用:

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了。我必须弄清楚为什么骆驼不会释放它们......