我正在使用 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
.
您还可以使用自定义错误处理程序。
关于spring - 当 MessageListener 抛出异常时,RabbitMQ 监听器停止监听消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466571/