`
黎剑发
  • 浏览: 3302 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

理解JMS规范中的持久订阅和非持久订阅

    博客分类:
  • JMS
JMS 
阅读更多
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: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必须是唯一的,订阅者的名称在同一个连接内必须唯一。这样才能唯一的确定连接和订阅者。
3.持久订阅的实现机制

   发送者发送消息给jms provider,如果此时provider发现没有任何的消费者(包括在线/离线),那么就会认为该消息无用,不需要存储,会直接删除。
   如果有在线的消费者,那么provider会将消息直接传送给在线消费者,因为这个时候连接是通的,消息有传输的通道。
   如果有离线的消费者,那么provider会把属于该消费者的消息存储下来,等消费者在线的时候,在将保存的离线消息推送给它。对于持久订阅者,jms        provider会在该消费者第一次登录在线的时候,将它的身份信息记录下来。记录身份的关键就是clientId和订阅者name。当持久订阅者又重新在线的时        候,provider会根据当前连接的clientId和订阅者name,去查询属于它的离线消息,并进行推送。
分享到:
评论

相关推荐

    JMS--消息持久订阅者测试

    本篇将基于提供的标题“JMS--消息持久订阅者测试”以及相关描述,详细介绍JMS中消息持久订阅者的测试流程、测试程序设计及结果分析。 #### 二、测试内容概述 根据标题与描述,本次测试主要聚焦于两种场景: 1. **...

    JMS1.1规范(中文)

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在...通过下载并研究"JMS1.1规范(中文).pdf",开发者可以深入理解JMS的工作原理,提高其在企业级应用开发中的实践能力。

    jms规范2.0(中英文都有)

    这个压缩包包含了JMS 2.0的中英文文档以及相关的JavaDoc,有助于开发者深入理解和使用JMS API。 首先,我们来详细了解一下JMS的核心概念和功能: 1. **消息与消息队列**:JMS中的消息是数据传输的载体,它包含了要...

    spring下queue与持久订阅topic实现

    在持久订阅中,即使订阅者离线,只要主题中有新消息发布,订阅者重新连接时仍能收到未读的消息。 在Spring中,持久订阅可以通过`DefaultMessageListenerContainer`实现,如下所示: ```java @Bean public ...

    JMS实现的信息的广播订阅

    6. **持久订阅和临时订阅**: 在JMS中,订阅可以是持久的或临时的。持久订阅确保即使消费者在消息发布时离线,也能在重新连接时接收到之前错过的消息。临时订阅则只在消费者在线时有效。 7. **消息选择器**: 如果...

    如何实现ActiveMq的Topic的持久订阅

    本篇文章将深入探讨如何在ActiveMQ中实现Topic的持久订阅。 首先,理解ActiveMQ的Topic和Queue的区别至关重要。Topic适用于广播消息,所有订阅了Topic的消费者都会接收到消息,而Queue则遵循先进先出(FIFO)原则,...

    ActiveMQ订阅模式持久化实现

    2. **创建订阅者**:在Java代码中,消费者需要通过`MessageConsumer`接口的`createDurableSubscriber`方法创建一个持久订阅。订阅时需提供一个唯一的名字,以便于识别和恢复订阅状态。 ```java Topic topic = ...

    JMS1.1 规范有中文和英文版本

    JMS1.1规范中还包括了事务管理,允许将消息发送和接收操作放入本地或全局事务中,以保证数据的一致性。此外,持久化机制确保即使在系统故障后,未被处理的消息也能被恢复,从而增强了系统的健壮性。 在实际应用中,...

    JMS 规范(英文)

    ### JMS规范详解 #### 一、概述 Java消息服务(Java Message Service,简称JMS)是Java平台中关于面向消息中间件(MOM)的API,...无论是初学者还是有经验的开发人员,深入理解JMS规范都是提高项目效率和质量的关键。

    JMS规范1.1

    JMS规范中还定义了一些新的特性,它们包括对消息确认和选择机制的改进,以及对消息持久性和消息域继承方法的增强。例如,JMS1.1版本提供了更多控制消息选择器和消息确认选项的功能,使得开发人员可以更灵活地处理...

    activemq中间件视频 jms规范

    通过这个视频系列,你不仅能够掌握ActiveMQ的基本操作,还能深入理解JMS规范,从而在实际项目中更有效地利用消息中间件进行解耦和异步通信。此外,了解ActiveMQ的性能调优和故障排查技巧也是提升系统稳定性的关键,...

    JMS规范教程pdf

    通过以上解析,我们可以看到JMS规范教程详细介绍了JMS的基本概念、消息模型以及通用设施,为开发者提供了构建和理解JMS应用程序所需的关键知识。JMS不仅提供了消息传递的基础结构,还涵盖了消息的管理和控制,使得...

    JMS之ActiveMQ 点对点+发布/订阅

    在JMS中,消息传递有两种基本模型:点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,Pub/Sub)。 **点对点(Point-to-Point,P2P)模型** 点对点模型是基于队列(Queue)的通信方式。在这个模型中,...

    应用openJMS实现JMS消息发布于订阅

    这通常通过`createDurableSubscriber()`方法完成,如果需要持久订阅(即使订阅者断开连接也能接收到消息)。 ```java MessageConsumer consumer = session.createDurableSubscriber(topic, "Subscriber1"); ``` ...

    JMS规范和简明教程

    通过深入理解和掌握JMS规范,开发者可以在分布式系统中构建健壮、可靠的通信机制,提升系统的稳定性和可扩展性。在实际开发中,结合具体的消息中间件,可以根据项目需求选择适合的通信模式和功能,实现高效的信息...

    JMS规范教程.docx

    Java消息服务(JMS,Java Message Service)是Java平台中用于企业级消息传递的一个标准API,它为应用程序提供了创建、发送、接收和...理解并熟练运用JMS的原理和实践,对于Java开发者在企业级应用开发中是至关重要的。

    JMS标准规范培训教程

    《JMS规范培训教程》这份文档很可能是深入理解JMS标准和实际应用的指南,它可能涵盖了JMS的基本概念、API用法、消息模型的比较、事务处理、消息持久化、故障恢复策略等内容。通过学习这份教程,开发者能够熟练地在...

    JMS IBM MQ 订阅模式

    1. **消息模型**:JMS支持两种主要的消息传递模型——点对点(Queue)和发布/订阅(Topic)。点对点模式中,消息从一个生产者发送到一个队列,然后由一个消费者接收。发布/订阅模式下,消息由发布者发送到主题,多个...

    JMS规范培训教程、JMS源代码

    Java消息服务(Java Message Service,简称JMS)是...通过深入学习这个教程和研究源代码,开发者可以更好地理解JMS的工作方式,并能在实际项目中有效地利用JMS进行应用程序间的数据交换,提高系统的可靠性和扩展性。

Global site tag (gtag.js) - Google Analytics