问题描述:

     1.消费者实现JMS的消息监听接口javax.jms.MessageListener,项目启动时启动MQ消费者

     2.消息确认机制使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE。

     3.在执行onMessage()后,没有显式的确认消息,消息没有从消息队列中删除

     4.问题来了,没有显式确认的消息永久留在消息队列中,不会再次被读取

 

 原因分析:

    1.MQ消息确认超时机制(发送消息,等待半小时,开启MQ消费者消息被消费)

    2.MQ消息重发次数超过上限,不再重发(通过打印,发现MQ消息里面带有一个参数,记录的重发次数,新启动一个消费者,多次重发的消息成功被消费)

    3.怀疑MQ消费者对读取过的消息进行标识了的,重新启动消费者,没有消费的消息能成功被消费

 

 结论:

    MQ的session会标记读取过的消息,重新创建session即可。