2019.12.16 activeMq踩坑
问题:
消息在消费方消费以后,消息队列中的消息未被确认和消费掉,依然存在在消息队列中。
资料原文
消息消费者-消息确认
1、确认机制(ack_mod)
AUTO_ACKNOWLEDGE = 1 自动确认
CLIENT_ACKNOWLEDGE = 2 客户端手动确认
DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
SESSION_TRANSACTED = 0 事务提交并确认
ACK_MODE描述了Consumer与broker确认消息的方式(时机),比如当消息被Consumer接收之后,Consumer将在何时确认消息。所以ack_mode描述的不是producer于broker之间的关系,而是customer于broker之间的关系。
对于broker而言,只有接收到ACK指令,才会认为消息被正确的接收或者处理成功了,通过ACK,可以在consumer与Broker之间建立一种简单的“担保”机制.
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
第一个参数:是否支持事务,如果为true,则会忽略第二个参数,自动被jms服务器设置为SESSION_TRANSACTED。
排查错误:
经过排查配置信息,发现
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
这行里面的false被标记成了true,导致上面设置的自动消费被更改为SESSION_TRANSACTED(事务提交并确认)导致在调试过程中未被及时确认。