6

エンドポイントのルートが処理されるのを待たずに、エンドポイントにメッセージを送信するにはどうすればよいですか(つまり、ルートはメッセージをディスパッチして終了するだけです)。

4

5 に答える 5

6

ワイヤータップまたはマルチキャストの使用はあなたが求めているものです。直接:エンドポイントは、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;
        }
    }
}

上記をwireTapに変更すると、次のようになります。

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

期待どおりに機能することがわかります。マルチキャストを使用することもできます。

                from(DIRECT_INPUT)
                    .multicast()
                    .to(DIRECT_NO_RETURN)
                    .to(MOCK_OUTPUT)
                    .end();
于 2014-01-22T02:43:38.377 に答える
4

wireTap(endpoint)答えです。

于 2012-08-30T08:31:48.960 に答える
2

ルートでinOnlyを使用すると、応答を待たずにメッセージをエンドポイントにのみ送信できます。詳細については、要求応答のドキュメントまたはイベントメッセージのドキュメントを参照してください。

from("direct:testInOnly").inOnly("mock:result");
于 2012-08-16T12:50:12.873 に答える
1

これは、使用しているエンドポイントなどによって異なる場合がありますが、一般的な方法の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エンドポイントにディスパッチすると、それらはスタックして処理を待機します。これは良い動作です。

于 2012-08-16T11:45:39.383 に答える
1

ProducerTemplateのasyncSend()メソッドを使用して、InOnlyメッセージをエンドポイントに送信できます。

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

詳細については、 http://camel.apache.org/async.htmlを参照してください。

于 2012-08-17T04:30:43.233 に答える