2016年1月25日星期一

JMS_001:创建JMS Session对象的方法详解


Connection.createSession(paramA,paramB);

(1)paramA 设置事务,paramB 设置 acknowledgment mode。
(2)paramA 为 false 时,paramB 的值可以为:Session.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE中的一个值。
(3)paramA 为 true 时,paramB 的值会被忽略,acknowledgment mode 会被JMS服务器设置为SESSION_TRANSACTED。
(4)Session.AUTO_ACKNOWLEDGE 表示自动确认,客户端发送和接收消息不需要做额外的工作。确认过程如下:客户端收到消息后自动发确认消息给Broker,然后等待Broker的收到确认回执。
(5)Session.CLIENT_ACKNOWLEDGE 表示需要客户端确认,客户端接收到消息后,必须调用 javax.jms.Message.acknowledge方法,JMS服务器才会删除消息。
适用于发送多条消息,然后发送确认消息,一次确认多条消息。确认过程和AUTO_ACKNOWLEDGE一样。
(6)Session.DUPS_OK_ACKNOWLEDGE 表示允许重复消息的确认模式,一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收,而且允许重复确认。
确认过程如下:在收到一定的消息数量(10个)或经过了一段时间(7秒)后,客户端会自动发送一个确认消息,但与 AUTO_ACKNOWLEDGE 和 CLIENT_ACKNOWLEDGE 不同的是 Broker 此时并不会发送一个收到确认回执,因此客户端也不等待这个回执。由于无法知道Broker是否收到了确认消息,一旦传输过程中丢失了客户端的确认消息,Broker就会重发相同的消息。
使用 Session.DUPS_OK_ACKNOWLEDGE 会在一定程度上提高消息的吞吐量,但是前提是使用场景允许重复消息。

参考文献:
1. http://blog.csdn.net/masterjames/article/details/9949081
2. https://docs.oracle.com/cd/E19587-01/821-0029/aeqbk/index.html

没有评论: