如何在不等待该端点的路由处理的情况下向端点发送消息(也就是说,我的路由应该只发送消息并完成)?
答案 0 :(得分: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;
}
}
}
现在,如果您将上述内容更改为wireTap:
from(DIRECT_INPUT)
.wireTap(DIRECT_NO_RETURN)
.to(MOCK_OUTPUT)
.end();
你会看到它按预期工作。您也可以使用多播:
from(DIRECT_INPUT)
.multicast()
.to(DIRECT_NO_RETURN)
.to(MOCK_OUTPUT)
.end();
答案 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端点的行为类似于队列,先进先出。如果您将多个事件分派给seda端点的速度快于路由可以完成处理它们,那么它们将堆叠起来并等待处理,这是一个很好的行为。
答案 2 :(得分:1)
您可以在路由中使用inOnly仅将消息发送到端点,而无需等待响应。有关详细信息,请参阅request reply documentation或event message documentation
from("direct:testInOnly").inOnly("mock:result");
答案 3 :(得分:1)
您可以使用ProducerTemplate的asyncSend()方法将InOnly消息发送到端点...
template.asyncSend("direct:myInOnlyEndpoint","myMessage");
请参阅http://camel.apache.org/async.html了解更多详情
答案 4 :(得分:1)
wireTap(endpoint)
就是答案。