消费者事件

当监听器(消费者)遇到某种故障时,容器会发布应用事件。事件 ListenerContainerConsumerFailedEvent 具有以下属性:

  • container: 发生问题的监听器容器。

  • reason: 故障的文本原因。

  • fatal: 一个布尔值,指示故障是否是致命的。对于非致命异常,容器会尝试根据 recoveryIntervalrecoveryBackoff (适用于 SimpleMessageListenerContainer) 或 monitorInterval (适用于 DirectMessageListenerContainer) 重启消费者。

  • throwable: 捕获到的 Throwable

可以通过实现 ApplicationListener<ListenerContainerConsumerFailedEvent> 来消费这些事件。

concurrentConsumers 大于 1 时,所有消费者都会发布系统级事件(例如连接故障)。

如果消费者因其某个队列被独占使用而失败,默认情况下,除了发布事件外,还会发出一个 DEBUG 级别的日志(自 3.1 版本起,之前是 WARN)。要更改此日志行为,请在 AbstractMessageListenerContainer 实例的 exclusiveConsumerExceptionLogger 属性中提供一个自定义的 ConditionalExceptionLogger。此外,SimpleMessageListenerContainer 在此类异常后重启消费者的日志级别默认为 DEBUG(之前是 INFO)。已向 ConditionalExceptionLogger 添加了一个新方法 logRestart() 以允许更改此行为。

此外,AbstractMessageListenerContainer.DefaultExclusiveConsumerLogger 现在是公共的,允许对其进行子类化。

另请参阅 记录通道关闭事件

致命错误始终以 ERROR 级别记录。这是不可修改的。

在容器生命周期的各个阶段还会发布其他几个事件:

  • AsyncConsumerStartedEvent: 消费者启动时。

  • AsyncConsumerRestartedEvent: 消费者在失败后重启时 - 仅适用于 SimpleMessageListenerContainer

  • AsyncConsumerTerminatedEvent: 消费者正常停止时。

  • AsyncConsumerStoppedEvent: 消费者停止时 - 仅适用于 SimpleMessageListenerContainer

  • ConsumeOkEvent: 从 broker 接收到 consumeOk 时,包含队列名称和 consumerTag

  • ListenerContainerIdleEvent: 请参阅 检测空闲异步消费者

  • MissingQueueEvent: 检测到缺失的队列时。