【问题标题】:ActiveMQ throwing Unmatched acknowledge exceptionActiveMQ 抛出不匹配的确认异常
【发布时间】:2015-03-11 18:42:25
【问题描述】:
WARN | Async error occurred: javax.jms.JMSException: Unmatched acknowledge: MessageAck {commandId = 30, responseRequired = false, ackType = 2, consumerId = ID:PC02-DT-009-52405-1421153309991-1:3:10:1, firstMessageId = ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1, lastMessageId = ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1, destination = queue://DATA.DESTINATION, transactionId = null, messageCount = 1, poisonCause = null}; Could not find Message-ID ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1 in dispatched-list (start of ack)
javax.jms.JMSException: Unmatched acknowledge: MessageAck {commandId = 30, responseRequired = false, ackType = 2, consumerId = ID:PC02-DT-009-52405-1421153309991-1:3:10:1, firstMessageId = ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1, lastMessageId = ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1, destination = queue://DATA.DESTINATION, transactionId = null, messageCount = 1, poisonCause = null}; Could not find Message-ID ID:PC02-DT-009-52360-1421152976467-1:4:11:1:1 in dispatched-list (start of ack)
    at org.apache.activemq.broker.region.PrefetchSubscription.assertAckMatchesDispatched(PrefetchSubscription.java:482)
    at org.apache.activemq.broker.region.PrefetchSubscription.acknowledge(PrefetchSubscription.java:214)
    at org.apache.activemq.broker.region.AbstractRegion.acknowledge(AbstractRegion.java:426)
    at org.apache.activemq.broker.region.RegionBroker.acknowledge(RegionBroker.java:408)
    at org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:77)
    at org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:77)
    at org.apache.activemq.broker.TransactionBroker.acknowledge(TransactionBroker.java:287)
    at org.apache.activemq.broker.MutableBrokerFilter.acknowledge(MutableBrokerFilter.java:87)
    at org.apache.activemq.broker.TransportConnection.processMessageAck(TransportConnection.java:508)
    at org.apache.activemq.command.MessageAck.visit(MessageAck.java:236)
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:329)
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:184)
    at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
    at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:288)
    atorg.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)

这是我在 activeMQ 日志中得到的异常。 场景:我有 10 个消费者,并且消费者正在侦听的目标队列中有 100 条消息。消费者正在获取大约 10-20 条消息的消息,但最终停止从队列中获取消息,但出现上述异常。我的理解是,只有在返回确认时才会向消费者提供新消息(如果我是对的).. JMS 容器:

<jms:listener-container container-type="default" connection-factory="jmsConsumerConnectionFactory" acknowledge="auto"> <jms:listener destination="DATA.DESTINATION" ref="jmsMessageListener" concurrency="10-15" method="onMessage"/> </jms:listener-container>

非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: java spring queue jms activemq


    【解决方案1】:

    好吧,让我感谢自己回答这个问题。显然,消费者在通过 httpclient 连接到数据库时遇到了一些异常,这会杀死所有消费者线程。 无论如何,任何有此问题的人都可以尝试通过以下方式解决, 1.增加activeMQ config "conf/activemq.xml"中的内存限制 2.尝试将确认方式更改为“已交易”或在消息本身中确认 message.acknowledge();

    【讨论】:

    • 您能否解释一下您向遇到此问题的其他人推荐的两项更改将如何解决您看到的异常?
    • 另外,听起来您使用的任何 JMS 使用者库(可能是 Spring 的 DMLC)中的异常处理可能存在问题。如果可能是这种情况,我鼓励您提交针对该库的错误报告,因为异常不应导致消费者无法允许消息失败并被移动到 DLQ。除非你说你的应用程序逻辑阻止了异常从你自己的代码中传播出去?
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 2016-09-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多