エンドポイントのルートが処理されるのを待たずに、エンドポイントにメッセージを送信するにはどうすればよいですか(つまり、ルートはメッセージをディスパッチして終了するだけです)。
5 に答える
ワイヤータップまたはマルチキャストの使用はあなたが求めているものです。直接:エンドポイントは、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();
wireTap(endpoint)
答えです。
ルートでinOnlyを使用すると、応答を待たずにメッセージをエンドポイントにのみ送信できます。詳細については、要求応答のドキュメントまたはイベントメッセージのドキュメントを参照してください。
from("direct:testInOnly").inOnly("mock:result");
これは、使用しているエンドポイントなどによって異なる場合がありますが、一般的な方法の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エンドポイントにディスパッチすると、それらはスタックして処理を待機します。これは良い動作です。
ProducerTemplateのasyncSend()メソッドを使用して、InOnlyメッセージをエンドポイントに送信できます。
template.asyncSend("direct:myInOnlyEndpoint","myMessage");
詳細については、 http://camel.apache.org/async.htmlを参照してください。