我在 Camel route 设置了一个errorHandler,它将在将消息发送到死信通道(在这种情况下为activemq队列)之前重试几次消息。我想看到的是错误消息,当消息未能重试最大次数然后被发送到死信队列时,将显示错误日志。

查看有关错误处理和死信通道的文档,似乎RedeliveryPolicy上有两个可用选项:retriesAttemptedLogLevel和retriesExhaustedLogLevel。假定默认情况下,retriesExhaustedLogLevel已设置为LoggingLevel.ERROR,但是在花费了所有重试并将消息路由到死信通道后,它似乎并没有实际记录任何内容。

这是我通过Java DSL定义的errorHandler。

.errorHandler(this.deadLetterChannel(MY_ACTIVE_MQ_DEAD_LETTER)
    .useOriginalMessage()
    .maximumRedeliveries(3)
    .useExponentialBackOff()
    .retriesExhaustedLogLevel(LoggingLevel.ERROR)
    .retryAttemptedLogLevel(LoggingLevel.WARN))

我现在已将级别显式设置为ERROR,并且它仍然似乎未注销任何内容(至任何日志记录级别)。另一方面,retryAttemptedLogLevel可以正常工作并将记录到适当的LoggingLevel(即,我可以将retryAttemptedLogLevel设置为LoggingLevel.ERROR并将重试视为错误日志)。但是,在用尽的情况下,我只希望有一个错误日志,而不是每次重试时都可以使用ERROR日志,因为随后的重试可能会成功。

也许我错过了一些东西,但是如果将ErrorHandler配置为DeadLetterChannel,则retriesExhaustedLogLevel似乎不执行任何操作...或不记录任何内容。是否仍需要我的配置,或者对于此特定的ErrorHandlerFactory,RedeliveryPolicy的此功能是否不执行?

我还可以设置一条路由来发送我的用尽的消息,这些消息只记录日志并路由到我的死信通道,但是如果可能的话,我宁愿尝试使用ErrorHandler中已经内置的内容。

最佳答案

将ErrorHandler的DeadLetterChannel更新为直接端点。剩下的两个logLevel配置相同。我得到了3次重试尝试的WARN日志,但是没有错误日志告诉我重试已用尽。但是,我确实设置了一条小路由,以监听记录的直接死信端点,并且该端点工作正常。

这不是我想要让ERROR日志用尽而无法解决的直接解决方案,但目前是可以接受的解决方法。

关于java - 如何配置 Camel 的RedeliveryPolicy retriesExhaustedLogLevel?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27639628/

10-11 22:23