0

我在 Camel 路由中设置了一个 errorHandler,它将在将消息发送到死信通道(在本例中为 activemq 队列)之前多次重试消息。我想要的是在消息未能重试最大次数然后被发送到死信队列时看到错误日志。

查看有关错误处理和死信通道的文档,似乎 RedeliveryPolicy 上有 2 个选项可用: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 日志)。但是,我只想要一个 ERROR 日志以防用尽,而不是在后续重试可能成功时为每次重试创建一个 ERROR 日志。

也许我遗漏了一些东西,但似乎 retriesExhaustedLogLevel 没有做任何事情......或者如果 ErrorHandler 配置为 DeadLetterChannel,则不会记录任何内容。是否有我仍然需要的配置,或者 RedeliveryPolicy 的这个功能没有针对这个特定的 ErrorHandlerFactory 执行?

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

4

2 回答 2

1

将 ErrorHandler 的 DeadLetterChannel 更新为直接端点。将 2 个 logLevel 配置保持不变。我得到了 3 次重试尝试的 WARN 日志,但没有 ERROR 日志告诉我重试已用尽。但是,我确实设置了一个小路由来监听记录的直接死信端点,并且可以正常工作。

不是直接解决我希望 ERROR 日志为疲惫而工作的愿望,但目前是一种可接受的解决方法。

于 2016-05-11T14:54:01.693 回答
0

请尝试使用此代码:

.errorHandler(deadLetterChannel("kafka:sample-dead-topic")
                .maximumRedeliveries(4).redeliveryDelay(60000)
                .retriesExhaustedLogLevel(LoggingLevel.WARN)
                .retryAttemptedLogLevel( LoggingLevel.WARN)
                                .retriesExhaustedLogLevel(LoggingLevel.ERROR)
                .logHandled(true)
                .allowRedeliveryWhileStopping(true)
                .logRetryStackTrace(true)
                .logExhausted(true)
                .logStackTrace(true)
                .logExhaustedMessageBody(true)
        )

重试配置为 1 分钟间隔。

Camel 应用程序使用详细信息记录了每次重试的错误。

于 2022-01-17T16:29:22.647 回答