Java camel:如何异步发送到端点

Java camel:如何异步发送到端点,java,apache-camel,Java,Apache Camel,如何在不等待端点的路由被处理的情况下将消息发送到端点(也就是说,我的路由应该只发送消息并完成)?这可能取决于您使用的端点等,但一种常见的方法是将seda端点放在两者之间是一个选项 from("foo:bar") .bean(processingBean) .to("seda:asyncProcess") // Async send .bean(moreProcessingBean) from("seda:asyncProcess") .to("final:endpoint");

如何在不等待端点的路由被处理的情况下将消息发送到端点(也就是说,我的路由应该只发送消息并完成)?

这可能取决于您使用的端点等,但一种常见的方法是将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端点的速度比路由完成处理的速度快,那么它们将堆积起来等待处理,这是一种很好的行为。

您可以在路由中使用inOnly仅将消息发送到端点,而不必等待响应。有关更多详细信息,请参阅或

您可以使用的asyncSend()方法将InOnly消息发送到端点

template.asyncSend("direct:myInOnlyEndpoint","myMessage");

有关更多详细信息,请参见

wireTap(端点)
是答案

使用无线窃听或多播是您追求的目标。无论指定了什么ExchangePattern,direct:端点都将修改下一步的交换。通过使用此失败测试,您可以看到:

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();
                from(DIRECT_INPUT)
                    .multicast()
                    .to(DIRECT_NO_RETURN)
                    .to(MOCK_OUTPUT)
                    .end();