理解JMS规范中的持久订阅和非持久订阅
来源:互联网 发布:淘宝网电子琴 编辑:程序博客网 时间:2024/05/22 02:11
jms1.1规范针对publisher/subscriber模型提出了持久订阅和非持久订阅者。我们用现实生活中的例子来说明,持久订阅和非持久订阅的区别。
1.非持久订阅
考虑学生听老师讲课的情景,大学老师讲课,一部分学生会去教室听课,另一部分学生会选择逃课在寝室睡觉。开始上课前,老师可能会点名,在教室听课的同学知道这个消息,逃课的同学就不知道这个消息(除非朋友电话通知的情况)。即老师发布消息的时候,如果学生在教室就能知道,不在教室就不知道。非持久订阅只有当客户端处于激活状态,也就是和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);
2.持久订阅
持久这个词往往和离线存储相关。大家都使用qq进行聊天,当你qq在线的时候,能够收到好友发送的消息;当你不在线,下次再登录的时候,仍然能够收到好友之前给你发送的消息。持久订阅时,客户端向JMS 服务器注册一个自己身份的ID,当这个客户端处于离线时,JMS Provider 会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS Provider时,会根据自己的ID得到所有当自己处于离线时发送到主题的消息。源码如下:
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:2758connection.setClientID("1");TopicSession session = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);// 在同一个连接的ClientID下,持久订阅者的名称必须唯一// javax.jms.JMSException: Durable consumer is in use for client: 1 and// subscriptionName: 11TopicSubscriber subscriber = session.createDurableSubscriber(topic,"11");创建持久订阅者,必须要指定connection的clientId和订阅者的名称。这个其实很好理解,你要想收到朋友发送的qq消息,前提就是你得先注册个QQ号,而且还要有台能上网的设备,电脑或手机。设备就相当于是clientId是唯一的;qq号相当于是订阅者的名称,在同一台设备上,不能用同一个qq号挂2个客户端。连接的clientId必须是唯一的,订阅者的名称在同一个连接内必须唯一。这样才能唯一的确定连接和订阅者。
3.持久订阅的实现机制
- 发送者发送消息给jms provider,如果此时provider发现没有任何的消费者(包括在线/离线),那么就会认为该消息无用,不需要存储,会直接删除。
- 如果有在线的消费者,那么provider会将消息直接传送给在线消费者,因为这个时候连接是通的,消息有传输的通道。
- 如果有离线的消费者,那么provider会把属于该消费者的消息存储下来,等消费者在线的时候,在将保存的离线消息推送给它。对于持久订阅者,jms provider会在该消费者第一次登录在线的时候,将它的身份信息记录下来。记录身份的关键就是clientId和订阅者name。当持久订阅者又重新在线的时 候,provider会根据当前连接的clientId和订阅者name,去查询属于它的离线消息,并进行推送。
2 0
- 理解JMS规范中的持久订阅和非持久订阅
- 理解JMS规范中的持久订阅和非持久订阅
- 理解JMS规范中的持久订阅和非持久订阅
- 理解JMS规范中的持久订阅和非持久订阅
- JMS持久订阅
- 关于 Jms Topic 持久订阅
- ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
- JMS 消息持久订阅者测试
- JMS持久订阅(DurableSubscribe)模式示例
- ActiveMQ 中的持久订阅配置
- Jboss7+HornetQ(持久订阅)
- 实现持久订阅消费者
- ActiveMQ持久订阅设置
- JMS学习笔记(五)——持久的订阅
- JMS学习六(ActiveMQ Topic之持久订阅)
- Redis事件订阅和持久化存储
- JMS学习十一(Spring+ActiveMQ消息持久化,Topic持久化订阅)
- ActiveMq持久订阅小例子
- Android浏览图片,点击放大至全屏效果
- StringBuffer的用法
- 下一站
- 2013年湖南省程序设计大赛 A 近似回文词
- 图片拉伸技巧
- 理解JMS规范中的持久订阅和非持久订阅
- Jsp开发中的若干问题
- 研发管理三大俗-CMMI、敏捷、IPD
- Codeforces Round #246 (Div. 2) - A. Choosing Teams
- ZOJ-2483
- 【VMware】虚拟机共享真实机的映射网络驱动器没有显示的解决方案
- DBUtils学习(一)
- 织梦DEDECMS验证码不能显示的原因以及解决办法
- Python实现简单的进制转换