2017-01-09 6 views
0

Apache Camel Servlet에 대한 요청이 즉시 반환되기를 원하지만 요청을 "백그라운드"스레드에서 계속 처리하려고합니다. 나는 여러 가지를 시도했지만, 돌아 오기 전에 여전히 많은 것을 처리하고있는 것 같습니다.Apache Camel Servlet 요청을 즉시 반환하려면 어떻게합니까?

curl 'http://localhost:4000/my-app/camel/my-endpoint' -X POST --data 'myVar=bar&myOtherVar=foo' 

어떤 아이디어를 내가 무슨 일을하고 있어요 :

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"); 

나는 컬을 사용하여 검사입니까?

답변

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)); 
    }); 

EDIT : 경고! 프로덕션에서 asyncSendBody를 사용한 후에는 시스템이 PID에서 빠져 나갔습니다. 카멜이 그들을 풀어주지 않는 이유를 알아 내야 만합니다 ...