Spring AMQP 由于消息未确认而卡在队列中
Spring AMQP stuck queue due to unack'd message
我正在使用 SimpleMessageListenerContainer 并且遇到问题,队列每隔一小时左右就会卡住,并且由于未确认的消息而无法处理任何内容。
我确定这是由于未正确捕获但无法跟踪问题的错误所致。
我已将确认模式设置为 NONE,这 "fixed" 问题,但它实际上只是隐藏了问题。此外,如果我想抛出 AmqpException 并重新排队消息,这不适用于将确认模式设置为 NONE.
我的问题是如何跟踪队列卡住的问题,有没有办法查看未确认消息的负载?或者是否有一种确认模式允许不需要确认但在抛出异常时重新排队消息?
这是我注册监听器的方式:
final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(new MQMessageListenerWrapper(listener));
container.setAcknowledgeMode(AcknowledgeMode.NONE);
container.start();
谢谢。
我最好的猜测是您的消费者线程挂在侦听器上游的某个地方。当控制返回到容器时,消息被确认或拒绝;如果线程返回到容器,它不能处于未确认状态。
使用jstack <pid>
找出消费者线程卡住的地方。
你是对的 NONE
只是在掩盖问题。
当队列卡住时,查看在特定队列上侦听的连接。可能是某种死锁情况的标志,因为 2 个(或更多)消费者线程在同一队列上侦听 - 因此被 rabbit 阻塞。
我最终找到了我的代码中的一个问题,因为它只在极少数情况下发生过。
这与 Spring AMQP 或 RabbitMQ 无关,只是我的错误编码:-)
我正在使用 SimpleMessageListenerContainer 并且遇到问题,队列每隔一小时左右就会卡住,并且由于未确认的消息而无法处理任何内容。
我确定这是由于未正确捕获但无法跟踪问题的错误所致。
我已将确认模式设置为 NONE,这 "fixed" 问题,但它实际上只是隐藏了问题。此外,如果我想抛出 AmqpException 并重新排队消息,这不适用于将确认模式设置为 NONE.
我的问题是如何跟踪队列卡住的问题,有没有办法查看未确认消息的负载?或者是否有一种确认模式允许不需要确认但在抛出异常时重新排队消息?
这是我注册监听器的方式:
final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(new MQMessageListenerWrapper(listener));
container.setAcknowledgeMode(AcknowledgeMode.NONE);
container.start();
谢谢。
我最好的猜测是您的消费者线程挂在侦听器上游的某个地方。当控制返回到容器时,消息被确认或拒绝;如果线程返回到容器,它不能处于未确认状态。
使用jstack <pid>
找出消费者线程卡住的地方。
你是对的 NONE
只是在掩盖问题。
当队列卡住时,查看在特定队列上侦听的连接。可能是某种死锁情况的标志,因为 2 个(或更多)消费者线程在同一队列上侦听 - 因此被 rabbit 阻塞。
我最终找到了我的代码中的一个问题,因为它只在极少数情况下发生过。
这与 Spring AMQP 或 RabbitMQ 无关,只是我的错误编码:-)