非持久化订阅持续到它们订阅对象的生命周期。这意味着,客户端只能在订阅者活动时看到相关主题发布的消息。如果订阅者不活动,它会错过相关主题的消息。如果花费较大的开销,订阅者可以被定义为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的持久订阅)相关推荐

  1. JMS学习十 ActiveMQ支持的传输协议

    JMS学习(ActiveMQ支持的传输协议) ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - bro ...

  2. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...

    一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...

  3. JMS学习(2):ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  4. JMS学习九 ActiveMQ的消息持久化到Mysql数据库

    1.将连接Mysql数据库驱动包,放到ActiveMQ的lib目录下 2,修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1  修改原来的kshadb的持久化 ...

  5. JMS学习(3):--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  6. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

  7. activemq 持久订阅_ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力

    activemq 持久订阅 因此,您希望使用ActiveMQ跨分布式主题进行发布-订阅,并且要可靠. 您可以使用永久订阅,对吗? 可以,但是,如果您将群集与ActiveMQ一起使用,则可能会遇到意外的 ...

  8. ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力

    因此,您希望跨分布式主题使用ActiveMQ进行发布-订阅,并且要可靠. 您可以只使用永久订阅,对不对? 可以,但是,如果将群集与ActiveMQ一起使用,则可能会遇到意外行为. 我最近在一个客户端上 ...

  9. ActiveMQ持久订阅设置

    在JMS中,Topic实现publish和subscribe语义.一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber将接收到消息的一个拷贝.但是在消息代理接收到消 ...

最新文章

  1. 50岁马斯克又恋爱了!27岁金发女友长着芭比娃娃脸
  2. 作为程序猿,一定要知道的电脑快捷键和Eclipse快捷键
  3. 一条正确的Java职业生涯规划,帮你突破瓶颈
  4. 游三大界后感(付照片)
  5. 取消服务器系统,取消系统服务器默认共享通道的方法
  6. 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
  7. PTA--一元多项式的乘法与加法运算
  8. OpenJDK8编译之后,缺少com.sun.tools.javac.Main怎么办
  9. 《python学习手册》目录
  10. CodecContext-gop_size 是什么
  11. 美通社日历 | 媒体关注、会展信息、企业财报发布,节假日备忘(12月21日—12月27日)...
  12. 物联网产品的发展简介(一)【产品篇01】
  13. python 编写正三角形,倒三角和菱形和各种镂空菱形
  14. 以桨为楫 修己度人(一)
  15. AngelScript -- C++程序最好的脚本语言
  16. 微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
  17. 计算机组成与维修考试试题,计算机组成原理试题与答案(考试资料)
  18. 机房建设及装修工程技术
  19. 投影仪应用软件安装电视家纯净版, 幸福指数飙升!
  20. php销售清单录入界面,列表,表格,商品清单表,注册表单的用法 2019年8月31日

热门文章

  1. Phonegap + JqueryMobile常见问题
  2. 双系统,重装windows后修复linux的grub启动
  3. yii 2.0 代码阅读 小记
  4. java.lang.NoSuchMethodError: org.apache.flink.table.api.TableColumn.isGenerated()Z
  5. 0x0000007F蓝屏问题摸索解决-没有完成
  6. Cant get connection to Zookeeper
  7. LookupError: No installed app with label 'user'
  8. hessian矩阵与鞍点关系浅析
  9. some understanding of《Inferring Decision Trees Using the Minimum Description Length Principle*》
  10. linux下面navicat调整字体