RabbitMQ listener stops listening messages when MessageListener throws exception
我正在使用 Spring AMQP 来处理 RabbitMQ 中的消息。下面是问题:
1.(比方说)RabbitMQ 内部有 3 条消息处于就绪状态
2. 第一个被 MessageListener 拾取并开始处理。 (比如说)它最终抛出一个异常
3. 在这种情况下,容器保持运行状态,但在我重新启动容器之前,不会处理剩余的 2 条消息。第一条消息也处于未确认状态。
这是预期的行为吗?如果没有,如何确保其他 2 条消息将被处理,而不管第一个处理失败?
MQ 配置:
1 2 3 4 5 6 7 8 9 10 | <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 类:
1 2 3 4 5 6 7 8 9 10 | public class MyProcessorListener implements MessageListener{ .... @Override public void onMessage(Message message) { try{ ...Some logic... } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } |
消息被一遍又一遍地重新传递;为了拒绝它(并丢弃或路由到死信队列),您需要抛出
您还可以使用自定义错误处理程序。
这在参考手册中都有解释。