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

理解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服务器和源码

    它既支持点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。 *. 支持同步与异步消息发送 *. JDBC持久性管理使用数据库表来存储消息 *. 可视化管理界面。 *. Applet支持。 *. 能够与Jakarta ...

    JMS的一个非常好的demo

    自己写的一个JMS的demo,包含点对点,发布/订阅的例子,以及DeliverMode的测试,还有持久的订阅者,解决topic模式下消息接收者离线后接收不到离线时错过的消息的问题。

    ActiveMQ中文手册

    1.2.6 持久订阅 3 1.2.7 本地事务 3 1.3 JMS 规范的变迁 4 2.ActiveMQ 4 2.1 Broker 4 2.1.1 运行Broker 4 2.1.2 嵌入式Broker 4 2.1.3 监控Broker 5 2.2 Transport 9 2.2.1 VM Transport 9 2.2.2...

    《JAVA消息服务》PDF]

    构建应用程序使用点至点和发布与订阅消息传递模式使用情况,如交易和持久订阅的功能,使应用程序的可靠消息内实施企业JavaBeans(EJB)的使用REST风格的应用程序和消息驱动bean使用的JMS Spring应用框架 消息是一个...

    Java消息服务(第2版)

    · 使用如事务和持久订阅功能,以使应用程序可靠 · 使用消息驱动的beans在Enterprise JavaBeans(EJB)中实现消息传递 · 使用JMS时结合RESTful应用程序和Spring应用程序框架 消息传递是一个强大的范例,可以更...

    ActiveMQ——Java连接ActiveMQ

    topic不保存消息它是无状态的不落地,假如无人订阅就去生产,那就是一条废消息,所以,一般先启动消费者再启动生产者JMS规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    6.3.3 可靠的JMS订阅 251 6.4 JMS消息 253 6.4.1 JMS消息类型 253 6.4.2 JMS消息头和消息属性 253 6.4.3 重用消息对象 254 6.4.4 JMS传递方式和有效时间 255 6.4.5 设置消息的优先级 256 6.4.6 消息的确认方式 256 ...

    ActiveMQ是Apache软件基金会所研发开源的消息中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信

     我们要在应用中使用ActiveMQ,根据JSM规范,需要获得一个JMS connection factory,然后再去创建connection,这个时候往往需要指定所使用的的协议。 消息模式  ActiveMQ提供了两种消息模式:点对点模式(Queue)...

    ActiveMQ从入门到精通(二)

    Selectors、消息的同步/异步接受方式、Message、P2P/PubSub、持久化订阅、持久化消息到MySQL以及与Spring整合等知识。接上一篇,本篇主要讨论的话题是:消息的顺序消费、JMS Selectors、消息的同步/异步接受方式、...

    xmljava系统源码-high-end-technology::angry_face_with_horns:Sharesomeofthehigh-endtechnologiescomm

    在一个队列中可靠的先进先出(FIFO)和严格的顺序传递 支持拉(pull)和推(push)两种消息模式 单一队列百万消息的堆积能力 支持多种消息协议,如 JMS、MQTT 等 高可用的部署架构,满足至少一次消息传递语义 提供 ...

    distributed_hornetq_durable_jta_demo

    分布式HornetQ持久JTA演示一个具有单个发布者和订阅者的演示JMS实现,每个实现都通过JTA强制JMS操作和相应的JDBC操作之间的事务性。用户注册网站演示发布者网络应用。 通过将用户的个人资料信息保存到数据库来向系统...

    ActiveMQ.chm

    activeMQ集成流程: activceMQ从了解过程,安装,消息发送模式的讲解,从点对点模式到订阅模式,及深入了解JMS,再到集成到spring,.消息的持久化,高级特性,应用场景,面试常用问题

    StudyDemo:学习演示

    jms-customer:可通过mvn assembly:assembly指定打包成一体的jar,主要功能是模拟主题持久化订阅(持久化) parseWsdl:重组jar,测试解析wsdl文件(关闭了主机验证,支持转发) spring-cloud-demo:春天云练习...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................

    精通websphere MQ

    消息驱动和消息触发............................................................................................... 15 记号约定.............................................................................

Global site tag (gtag.js) - Google Analytics