JMS学习七(ActiveMQ之Topic的持久订阅)
非持久化订阅持续到它们订阅对象的生命周期。这意味着,客户端只能在订阅者活动时看到相关主题发布的消息。如果订阅者不活动,它会错过相关主题的消息。如果花费较大的开销,订阅者可以被定义为durable(持久化的)。持久化的订阅者注册一个带有JMS保持的唯一标识的持久化订阅(subscription)。带有相同标识的后续订阅者会再续前一个订阅者的订阅状态。如果持久化订阅没有活动的订阅者,JMS会保持订阅消息,直到消息被订阅接收或者过期。
生产者:
package cn.slimsmart.activemq.demo.topic; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; public class Producer { public static void main(String[] args) throws JMSException { // 连接到ActiveMQ服务器 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.18.43:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 创建主题 Topic topic = session.createTopic("slimsmart.topic.test"); MessageProducer producer = session.createProducer(topic); // NON_PERSISTENT 非持久化 PERSISTENT 持久化,发送消息时用使用持久模式 producer.setDeliveryMode(DeliveryMode.PERSISTENT); TextMessage message = session.createTextMessage(); message.setText("topic 消息。"); message.setStringProperty("property", "消息Property"); // 发布主题消息 producer.send(message); System.out.println("Sent message: " + message.getText()); session.commit(); session.close(); connection.close(); } }
消费者:
package cn.slimsmart.activemq.demo.topic; import javax.jms.Connection; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; /** * 持久订阅设置唯一的客户端ID和订阅者ID。 */ public class ConsumerPersistent { public static void main(String[] args) throws JMSException { String clientId = "client_id"; // 连接到ActiveMQ服务器 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.18.43:61616"); Connection connection = factory.createConnection(); //客户端ID,持久订阅需要设置 connection.setClientID(clientId); connection.start(); Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建主题 Topic topic = session.createTopic("slimsmart.topic.test"); // 创建持久订阅,指定客户端ID。 MessageConsumer consumer = session.createDurableSubscriber(topic,clientId); consumer.setMessageListener(new MessageListener() { // 订阅接收方法 public void onMessage(Message message) { TextMessage tm = (TextMessage) message; try { System.out.println("Received message: " + tm.getText()+":"+tm.getStringProperty("property")); } catch (JMSException e) { e.printStackTrace(); } } }); } }
注:
1.activemq区分消费者,是通过clientID和订阅客户名称来区分的。
2.消息的生产者,发送消息时用使用持久模式。
3.使用相同的“clientID”,则认为是同一个消费者。两个程序使用相同的“clientID”,则同时只能有一个连接到activemq,第二个连接的会报错。
4.activemq的设置在conf/activemq.xml中,默认消息是保存在data/kahadb中,重启activemq消息不会丢。
转载于:https://www.cnblogs.com/alter888/p/8976221.html
JMS学习七(ActiveMQ之Topic的持久订阅)相关推荐
- JMS学习十 ActiveMQ支持的传输协议
JMS学习(ActiveMQ支持的传输协议) ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - bro ...
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- JMS学习(2):ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...
- JMS学习九 ActiveMQ的消息持久化到Mysql数据库
1.将连接Mysql数据库驱动包,放到ActiveMQ的lib目录下 2,修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1 修改原来的kshadb的持久化 ...
- JMS学习(3):--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)
一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...
- activemq 持久订阅_ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力
activemq 持久订阅 因此,您希望使用ActiveMQ跨分布式主题进行发布-订阅,并且要可靠. 您可以使用永久订阅,对吗? 可以,但是,如果您将群集与ActiveMQ一起使用,则可能会遇到意外的 ...
- ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力
因此,您希望跨分布式主题使用ActiveMQ进行发布-订阅,并且要可靠. 您可以只使用永久订阅,对不对? 可以,但是,如果将群集与ActiveMQ一起使用,则可能会遇到意外行为. 我最近在一个客户端上 ...
- ActiveMQ持久订阅设置
在JMS中,Topic实现publish和subscribe语义.一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber将接收到消息的一个拷贝.但是在消息代理接收到消 ...
最新文章
- 50岁马斯克又恋爱了!27岁金发女友长着芭比娃娃脸
- 作为程序猿,一定要知道的电脑快捷键和Eclipse快捷键
- 一条正确的Java职业生涯规划,帮你突破瓶颈
- 游三大界后感(付照片)
- 取消服务器系统,取消系统服务器默认共享通道的方法
- 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
- PTA--一元多项式的乘法与加法运算
- OpenJDK8编译之后,缺少com.sun.tools.javac.Main怎么办
- 《python学习手册》目录
- CodecContext-gop_size 是什么
- 美通社日历 | 媒体关注、会展信息、企业财报发布,节假日备忘(12月21日—12月27日)...
- 物联网产品的发展简介(一)【产品篇01】
- python 编写正三角形,倒三角和菱形和各种镂空菱形
- 以桨为楫 修己度人(一)
- AngelScript -- C++程序最好的脚本语言
- 微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
- 计算机组成与维修考试试题,计算机组成原理试题与答案(考试资料)
- 机房建设及装修工程技术
- 投影仪应用软件安装电视家纯净版, 幸福指数飙升!
- php销售清单录入界面,列表,表格,商品清单表,注册表单的用法 2019年8月31日
热门文章
- Phonegap + JqueryMobile常见问题
- 双系统,重装windows后修复linux的grub启动
- yii 2.0 代码阅读 小记
- java.lang.NoSuchMethodError: org.apache.flink.table.api.TableColumn.isGenerated()Z
- 0x0000007F蓝屏问题摸索解决-没有完成
- Cant get connection to Zookeeper
- LookupError: No installed app with label 'user'
- hessian矩阵与鞍点关系浅析
- some understanding of《Inferring Decision Trees Using the Minimum Description Length Principle*》
- linux下面navicat调整字体