在OpenMQ中超时后消息丢失

时间:2015-04-07 21:21:24

标签: java spring spring-jms openmq

我有一个系统,我们使用OpenMQ。我注意到有时候我们会从消费者那里收到这个错误:

WARN  org.springframework.jms.listener.DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'Sun Java System MQ Destination
getName():      xxMessageNamexx
Class:          com.sun.messaging.Queue
getVERSION():       3.0
isReadonly():       false
getProperties():    {imqDestinationName=xxDestinationNamexx, imqDestinationDescription=A Description for the Destination Object}' - trying to recover. Cause: [C4000]: Packet acknowledge failed. user=guest, broker=xxx:5555(55385)
com.sun.messaging.jms.JMSException: [C4000]: Packet acknowledge failed. user=guest, broker=xxx:5555(55385)

此外,该邮件已丢失,不再在队列中。

我知道我可以通过增加 imqAckTimeout 来解决这个问题,但我想知道我们是否有超时问题,为什么邮件会从队列中删除?

我是消息队列的新手,所以请让我知道我能提供哪些有助于解决问题的信息?

1 个答案:

答案 0 :(得分:1)

嗯,这个答案现在向我解释了一切https://stackoverflow.com/a/9886168/3314116

似乎在AbstractMessageListenerContainer中使用AUTO_ACKNOWLEDGE模式可以在消息消耗之前确认消息。对我来说,最好的选择是使用交易