【问题标题】:camel: how can i send to an endpoint asynchronously骆驼:我如何异步发送到端点
【发布时间】:2012-08-16 06:38:55
【问题描述】:

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

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    使用wireTap 或多播是您所追求的。无论指定什么 ExchangePattern,direct: 端点都会为下一步修改 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;
            }
        }
    }
    

    现在,如果您将上述内容更改为wireTap:

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

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

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

    【讨论】:

      【解决方案2】:

      wireTap(endpoint) 就是答案。

      【讨论】:

        【解决方案3】:

        您可以在您的路由中使用 inOnly 来仅将您的消息发送到端点而不等待响应。有关详细信息,请参阅request reply documentationevent message documentation

        from("direct:testInOnly").inOnly("mock:result");
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            您可以使用ProducerTemplate 的 asyncSend() 方法向端点发送 InOnly 消息...

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

            查看http://camel.apache.org/async.html了解更多详情

            【讨论】:

              猜你喜欢
              • 2012-05-04
              • 1970-01-01
              • 2011-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-30
              相关资源
              最近更新 更多