如何配置 Camel 的重新传送策略重试耗尽日志级别?



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

查看错误处理和死信通道的文档,重新传递策略上似乎有 2 个可用选项:retriesTryedLogLevel 和 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,但它似乎仍然没有注销任何内容(到任何日志记录级别)。另一方面,retryTryedLogLevel 工作正常,并将记录到适当的 LoggingLevel (即,我可以将 retryTryedLogLevel 设置为 LoggingLevel.ERROR,并将重试视为 ERROR 日志)。但是,我只希望在用尽的情况下使用单个错误日志,而不是在后续重试可能成功时每次重试的 ERROR 日志。

也许我错过了一些东西,但似乎重试耗尽日志级别没有做任何事情......或者如果错误处理程序配置为 DeadLetterChannel,则不记录任何内容。是否有我仍然需要的配置,或者重新传递策略的此功能是否未对此特定错误处理程序工厂执行?

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

将 ErrorHandler 的 DeadLetterChannel 更新为直接端点。保持 2 个日志级别配置不变。我收到了 3 次重试尝试的 WARN 日志,但没有错误日志告诉我重试已用尽。但是,我确实设置了一条小路由,侦听记录的直接死信端点,并且正在工作。

这不是我希望让 ERROR 日志为耗尽工作的愿望的直接解决方案,但目前是一种可接受的解决方法。

请尝试使用此代码:

.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应用程序使用详细信息记录了evry重试的错误。

最新更新