我想申请重新发送并使用死信频道。所以发现这个非常有用的apache-camel FAQ link。我按照本网站提到的步骤进行了操作。
我添加了更多逻辑,代码在github中可用。
基本上,根据常见问题解答,我们必须拆分路由,以便(如FAQ中所述)驼峰可以处理子路由中的任何异常。 这是代码(Camel Route):
@Override
public void configure() throws Exception {
errorHandler(deadLetterChannel("mock:error")
.logExhaustedMessageBody(true)
.logExhausted(true)
.logRetryStackTrace(true)
.maximumRedeliveries(3)
.redeliveryDelay(1000)
.backOffMultiplier(2)
.useOriginalMessage()
.useExponentialBackOff());
from("direct:start")
.log("Dump incoming body: " + body())
.to("direct:sub")
.end();
from("direct:sub")
.errorHandler(noErrorHandler())
.process(new SubRouteProcessor())
.log("Dump incoming body: "+ body())
.process(new NewSubRouteProcessor())
.transform(body().append("Modified Data !"))
.to("mock:result");
}
单元测试:在Exchange Received上,setup会检查正文是否与预期的字符串匹配,然后抛出异常。在路由中,当处理器收到Exchange时,它会抛出异常,但会永远运行...
@Before
public void setUp() throws Exception{
super.setUp();
mockResult.whenAnyExchangeReceived(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
if(body.startsWith("FAIL ALWAYS")){
throw new Exception("Error publishing message");
}
}
});
}
@Test
public void failingMessage() throws Exception{
mockResult.expectedMessageCount(4);
mockError.expectedMessageCount(1);
mockError.expectedBodiesReceived("FAIL ALWAYS");
long startTime = System.currentTimeMillis();
pTemplate.sendBody("FAIL ALWAYS");
assertMockEndpointsSatisfied();
long endTime = System.currentTimeMillis();
assertTrue(endTime - startTime > 7000);
}
我写了一个简单的单元测试,以触发异常,因此重新执行代码被执行。
现在难度/问题:预期的行为是只进行3次重新传递尝试,延迟时间为1000毫秒,并且ExponentialBackOff。
然而,测试永远运行,继续以指数延迟进行重新传递。如果我删除/注释2个处理器调用,代码运行正常,意味着异常,它只进行3次重试。
你能帮忙理解吗, 1)此代码/路由有什么问题? 2)是什么导致代码永远运行? 3)为什么删除这些处理器,它的工作,重试发生 说的次数只是?
我只想要 - 直到" direct:sub"抛出"异常",控件返回"直接:开始",重新尝试从某一点处理消息。
谢谢!