2017-01-09 9 views
0

Я хочу, чтобы запрос сервлета Apache Camel немедленно возвращался, но продолжайте обработку запроса в «фоновом» потоке. Я пробовал несколько вещей, но кажется, что он все еще много обрабатывает, прежде чем вернуться.Как я могу немедленно вернуть запрос сервлета Apache Camel?

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 '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

Я получил 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)); 
    }); 

EDIT: Внимание! После использования asyncSendBody в производстве машина быстро вышла из PID. Мне нужно выяснить, почему Camel не выпускает их ...