我正在使用一个SimpleMessageListenerContainer,并且每隔一小时左右就会遇到一些问题,因为一条unack'd消息会导致队列卡住并且不会处理任何内容。
我确信这是由于错误未被正确捕获但无法追踪问题。
我已将确认模式设置为NONE,这“修复”了问题但实际上只是隐藏了问题。此外,如果我想抛出AmqpException并重新排队消息,这不能用于将确认模式设置为NONE。
我的问题是如何跟踪队列卡住的问题,有没有办法查看unack'd消息的有效负载?或者是否存在确认模式,允许不需要确认但是如果抛出异常则重新排队消息?
以下是我注册听众的方式:
final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(new MQMessageListenerWrapper(listener));
container.setAcknowledgeMode(AcknowledgeMode.NONE);
container.start();
感谢。
答案 0 :(得分:1)
我最好的猜测是你的消费者线程挂在监听器上游的某个地方。当控件返回容器时,消息被激活或拒绝;如果线程返回容器,则不能处于unack'd状态。
使用jstack <pid>
找出消费者线程被卡住的位置。
你是对的NONE
只是掩盖了这个问题。
答案 1 :(得分:1)
当队列卡住时,查看侦听特定队列的连接。可能是某种死锁情况的迹象,因为2个(或更多)消费者线程在同一个队列上进行侦听 - 因此被兔子阻止。
答案 2 :(得分:0)
这是我的代码中的一个问题,我最终跟踪了它,因为它只发生在极少数情况下。
这与Spring AMQP或RabbitMQ无关,只是我的编码不好: - )