背景
activeMQ
java 端写了发送和消费消息的DEMO。但是消费程序运行结束,控制台里的‘Number Of Pending Messages ’和‘Messages Enqueued ’ 没变,依然是1.
如下图:
原因
原因是消费端创建Session方法createSession的第一个参数transacted传来’TRUE’,传’FALSE’就可以了。
原来有问题的创建Session的代码:
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
方法定义:
Session createSession(boolean transacted, int acknowledgeMode)
参数解释:
transacted – indicates whether the session is transacted
acknowledgeMode – indicates whether the consumer or the client will acknowledge any messages it receives; ignored if the session is transacted. Legal values are Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE, and Session.DUPS_OK_ACKNOWLEDGE.
解释一下:
- 第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
- 第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
- Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
- Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
- DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
接口文档中并没有,明确说明为什么支持事务后,消息被消费后,不会删除。但是实际情况是这样的。