2012-08-16 70 views

回答

1

wireTap(endpoint)就是答案。

1

这可能取决于您正在使用的端点等,但一种常用的方法是将seda端点放在两者之间是一个选项。

from("foo:bar") 
    .bean(processingBean) 
    .to("seda:asyncProcess") // Async send 
    .bean(moreProcessingBean) 

from("seda:asyncProcess") 
    .to("final:endpoint"); // could be some syncrhonous endpoint that takes time to send to. http://server/heavyProcessingService or what not. 

seda端点的行为类似于先进先出的队列。如果您向seda端点派发多个事件的速度比路由可以完成处理速度快,则它们将堆叠并等待处理,这是一个很好的行为。

4

使用wireTap或多播是你所追求的。无论指定什么ExchangePattern,直接:端点都将修改Exchange以进行下一步。您可以使用此测试失败,请参阅:

public class StackOverflowTest extends CamelTestSupport { 
    private static final String DIRECT_INPUT = "direct:input"; 
    private static final String DIRECT_NO_RETURN = "direct:no.return"; 
    private static final String MOCK_OUTPUT = "mock:output"; 
    private static final String FIRST_STRING = "FIRST"; 
    private static final String SECOND_STRING = "SECOND"; 

    @NotNull 
    @Override 
    protected RouteBuilder createRouteBuilder() throws Exception { 
     return new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       from(DIRECT_INPUT) 
         .to(ExchangePattern.InOnly, DIRECT_NO_RETURN) 
         .to(MOCK_OUTPUT) 
         .end(); 

       from(DIRECT_NO_RETURN) 
         .bean(new CreateNewString()) 
         .end(); 
      } 
     }; 
    } 

    @Test 
    public void testShouldNotModifyMessage() throws JsonProcessingException, InterruptedException { 
     final MockEndpoint myMockEndpoint = getMockEndpoint(MOCK_OUTPUT); 
     myMockEndpoint.expectedBodiesReceived(FIRST_STRING); 
     template.sendBody(DIRECT_INPUT, FIRST_STRING); 
     assertMockEndpointsSatisfied(); 
    } 

    public static class CreateNewString { 
     @NotNull 
     public String handle(@NotNull Object anObject) { 
      return SECOND_STRING; 
     } 
    } 
} 

现在,如果你改变了以上对窃听:

   from(DIRECT_INPUT) 
        .wireTap(DIRECT_NO_RETURN) 
        .to(MOCK_OUTPUT) 
        .end(); 

,你会看到它按预期工作。您也可以使用多播:

   from(DIRECT_INPUT) 
        .multicast() 
        .to(DIRECT_NO_RETURN) 
        .to(MOCK_OUTPUT) 
        .end();