spring - 当 MessageListener 抛出异常时,RabbitMQ 监听器停止监听消息

标签 spring rabbitmq spring-amqp spring-rabbit

我正在使用 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 类:

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 .

关于spring - 当 MessageListener 抛出异常时,RabbitMQ 监听器停止监听消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466571/

相关文章:

spring - 由于 "Injection of autowired dependencies failed",无法启动嵌入式 Tomcat

java - 在请求范围内使用工厂方法 Autowiring

java - 如何在 spring 项目中正确注入(inject) @Autowired 依赖而不使用 getBean?是否可以?

rabbitmq - celery 任务发送到rabbitmq经纪人后丢失

spring - 使用 @ManyToOne 关联时传递到持久错误的分离实体

java - 使用 RabbitMQ 实现 Saga 消息传递

java - Java可以监听多个RabbitMQ队列吗?

spring - 如何使用 Spring Rabbitmq 连接到多个 Rabbitmq 节点?

java - 使用 Spring AMQP 监听许多短暂的、动态创建的队列

java - 防止AMQP队列消费者中的无限循环