退避不适用于Apache Camel重新传递

时间:2015-08-14 18:55:59

标签: jms apache-camel

(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

1 个答案:

答案 0 :(得分:3)

想出来了。

以下是可用的配置参数(有很多)。

在错误处理程序上:

defaultErrorHandler()
    .maximumRedeliveries(-1) 
    .useExponentialBackOff()
    .backOffMultiplier(2)
    .maximumRedeliveryDelay(10000)
    .redeliveryDelay(500)

在URI上:

requestTimeout=400&
requestTimeoutCheckerInterval=300

这里有一些场景的行为方式非常不同

方案A)JMS服务器已关闭。

如果服务器已关闭,则URI(requestTimeoutrequestTimeoutCheckerInterval)中的字段永远不会播放。使用上面的设置,您应该看到重试延迟:500,1000,2000,4000,8000,10000,10000,10000 ......

方案B)JMS服务器已启动,但另一方的消费者未响应。

requestTimeout值永远不会增加,但重试延迟是。因此,您将看到的是重试延迟:900,1400,2400,4400,8400,10400,10400,10400 ....

为什么呢?因为它需要400毫秒(实际失败requestTimeout,之后errorHandler计时器才会启动)。

陷入困境!!!

  • 这里有点doozy,这是来自*MessageListenerContainer
  • 的日志消息

Could not refresh JMS Connection for destination 'REPLY.A.QUEUE' - retrying using FixedBackOff{interval=5000, currentAttempts=67, maxAttempts=unlimited}

这有无事可做重试消息,它发生在另一个线程中。那FixedBackOff事是一个红色的鲱鱼。

  • requestTimeoutCheckerInterval必须始终为< = requestTimeout,否则超时似乎会比它应该
  • 更晚发生