【问题标题】:Message is lost after time out in OpenMQOpenMQ 超时后消息丢失
【发布时间】:2015-06-12 15:16:25
【问题描述】:

我有一个使用 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 来解决此问题,但我想知道是否存在超时问题,为什么消息会从队列中删除?

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

【问题讨论】:

  • 一般情况下,在没有事务的情况下进行破坏性读取时,可能会发生这种消息丢失。您是否在交易中消费?
  • 我没有为我的消费者使用交易。我正在使用 AUTO_ACKNOWLEDGE 模式。好吧,这个答案现在向我解释了一切stackoverflow.com/a/9886168/3314116。似乎在 AbstractMessageListenerContainer 中使用 AUTO_ACKNOWLEDGE 模式可以让消息在消息消费之前得到确认。我猜对我来说最好的选择是使用交易。

标签: java spring spring-jms openmq


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多