jms1.1规范针对publisher/subscriber模型提出了持久订阅和非持久订阅者。我们用现实生活中的例子来说明,持久订阅和非持久订阅的区别。
考虑学生听老师讲课的情景,大学老师讲课,一部分学生会去教室听课,另一部分学生会选择逃课在寝室睡觉。开始上课前,老师可能会点名,在教室听课的同学知道这个消息,逃课的同学就不知道这个消息(除非朋友电话通知的情况)。即老师发布消息的时候,如果学生在教室就能知道,不在教室就不知道。非持久订阅只有当客户端处于激活状态,也就是和JMS Provider 保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。在我们的例子中,教室是jms provider和主题,老师是消息发送者,学生是消息接受者。客户端处于激活状态,就相当与学生在教室中。创建非持久订阅者的代码如下:
TopicConnection connection = JmsUtils.getConnection(); Topic topic = JmsUtils.getTopic(); TopicSession session = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); TopicSubscriber subscriber = session.createSubscriber(topic,null,true);
TopicConnection connection = JmsUtils.getConnection(); Topic topic = JmsUtils.getTopic(); // 创建持久订阅的时候,必须要设置client,否则会报错: // javax.jms.JMSException: You cannot create a durable subscriber // without specifying a unique clientID on a Connection // 如果clientID重复(已经存在相同id的活动连接),会报错 // javax.jms.InvalidClientIDException: Broker: localhost - Client: 1 // already connected from tcp://127.0.0.1:2758 connection.setClientID("1"); TopicSession session = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); // 在同一个连接的ClientID下,持久订阅者的名称必须唯一 // javax.jms.JMSException: Durable consumer is in use for client: 1 and // subscriptionName: 11 TopicSubscriber subscriber = session.createDurableSubscriber(topic,"11");创建持久订阅者,必须要指定connection的clientId和订阅者的名称。这个其实很好理解,你要想收到朋友发送的qq消息,前提就是你得先注册个QQ号,而且还要有台能上网的设备,电脑或手机。设备就相当于是clientId是唯一的;qq号相当于是订阅者的名称,在同一台设备上,不能用同一个qq号挂2个客户端。连接的clientId必须是唯一的,订阅者的名称在同一个连接内必须唯一。这样才能唯一的确定连接和订阅者。
理解JMS规范中的持久订阅和非持久订阅,布布扣,bubuko.com
原文:http://blog.csdn.net/aitangyong/article/details/26013387