2017-01-09 27 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了。我必須弄清楚爲什麼駱駝不會釋放它們......

相關問題