(Camel版本2.14.1)
我试图让Camel使用退避重新传递策略重试msg到JMS(实际上是通过JMS的MQ)。这就是我所拥有的:
errorHandler(defaultErrorHandler()
.maximumRedeliveries(-1)
.useExponentialBackOff()
.backOffMultiplier(2)
.maximumRedeliveryDelay(30000)
.retryAttemptedLogLevel(LoggingLevel.WARN));
from("direct:in")
.log("Sending message to MQ")
.to("mq:MY_QUEUE?requestTimeout=1000");
我对这里应该发生的事情的理解是初始超时将是1000毫秒。之后,骆驼将等待2000毫秒,然后等待4000毫秒等,直到我们达到30000毫秒。
发生的事情是 重播消息,但每次都是1000毫秒。
我需要在上面的代码中更改哪些内容才能获得我正在寻找的结果?
TIA
答案 0 :(得分:3)
想出来了。
以下是可用的配置参数(有很多)。
在错误处理程序上:
defaultErrorHandler()
.maximumRedeliveries(-1)
.useExponentialBackOff()
.backOffMultiplier(2)
.maximumRedeliveryDelay(10000)
.redeliveryDelay(500)
在URI上:
requestTimeout=400&
requestTimeoutCheckerInterval=300
这里有一些场景的行为方式非常不同
如果服务器已关闭,则URI(requestTimeout
和requestTimeoutCheckerInterval
)中的字段永远不会播放。使用上面的设置,您应该看到重试延迟:500,1000,2000,4000,8000,10000,10000,10000 ......
requestTimeout值永远不会增加,但重试延迟是。因此,您将看到的是重试延迟:900,1400,2400,4400,8400,10400,10400,10400 ....
为什么呢?因为它需要400毫秒(实际失败requestTimeout
,之后errorHandler计时器才会启动)。
*MessageListenerContainer
: Could not refresh JMS Connection for destination 'REPLY.A.QUEUE' - retrying using FixedBackOff{interval=5000, currentAttempts=67, maxAttempts=unlimited}
这有无事可做重试消息,它发生在另一个线程中。那FixedBackOff
事是一个红色的鲱鱼。
requestTimeoutCheckerInterval
必须始终为< = requestTimeout
,否则超时似乎会比它应该