由于unack&#d; d消息,Spring AMQP卡在队列中

时间:2015-02-02 18:01:40

标签: java spring rabbitmq spring-amqp

我正在使用一个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();

感谢。

3 个答案:

答案 0 :(得分:1)

我最好的猜测是你的消费者线程挂在监听器上游的某个地方。当控件返回容器时,消息被激活或拒绝;如果线程返回容器,则不能处于unack'd状态。

使用jstack <pid>找出消费者线程被卡住的位置。

你是对的NONE只是掩盖了这个问题。

答案 1 :(得分:1)

当队列卡住时,查看侦听特定队列的连接。可能是某种死锁情况的迹象,因为2个(或更多)消费者线程在同一个队列上进行侦听 - 因此被兔子阻止。

答案 2 :(得分:0)

这是我的代码中的一个问题,我最终跟踪了它,因为它只发生在极少数情况下。

这与Spring AMQP或RabbitMQ无关,只是我的编码不好: - )

相关问题