RabbitMQ 监听器在 MessageListener 抛出异常时停止监听消息

RabbitMQ listener stops listening messages when MessageListener throws exception

我正在使用 Spring AMQP 处理 RabbitMQ 中的消息。

问题如下:
1.(比如说)在 RabbitMQ
中有 3 条消息处于就绪状态 2. 第一个被 MessageListener 拾取并开始处理。 (比如说)它最终抛出一个异常
3. 在这种情况下,容器保持启动状态,但在我重新启动容器之前不会处理剩余的 2 条消息。此外,第一条消息仍处于未确认状态。

这是预期的行为吗?如果不是,如何确保其他 2 条消息将被处理,而不管第一条消息处理失败?

MQ 配置:

<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" /> 

<rabbit:admin connection-factory="connectionFactory" />

<rabbit:listener-container
    connection-factory="connectionFactory" 
    concurrency="1"
    acknowledge="auto">
    <rabbit:listener queue-names="testQueue" ref="myProcessorListener " />
</rabbit:listener-container>

MessageListener class:

public class MyProcessorListener implements MessageListener{
....
    @Override
public void onMessage(Message message) {
try{
...Some logic...

} catch (Exception e) {
  throw new RuntimeException(e.getMessage(), e);
}

消息被一遍又一遍地重新传递;为了拒绝它(并丢弃或路由到死信队列),您需要抛出 AmqpRejectAndDontRequeueException 或将容器的 requeue-rejected 属性 设置为 false。使用 Java 配置时为 defaultRequeueRejected

您还可以使用自定义错误处理程序。

这是全部explained in the reference manual