一、Pub/Sub-发布/订阅消息传递模型

在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic。topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

发布订阅模型就像订阅报纸。我们可以选择一份或者多份报纸,比如:北京日报、人民日报。这些报纸就相当于发布订阅模型中的topic。如果有很多人订阅了相同的报纸,那我们就在同一个topic中注册,对于报纸发行方,它就和所有的订阅者形成了一对多的关系。如下:

二,Pub/Sub特点

1,每个消息可以有多个消费者。

2,发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个或多个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

3,为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

三,发布订阅模型的实现

3.1,发布者

/*** * @类名称:ActiveMQpubsubProducter* @类描述:发布者-发布订阅模型*/
public class ActiveMQpubsubProducter {//会话对象private static Session session = null;public static void sendMessages(String name){try {session = ActiveMQLinkUtil.initConnection(true, Session.AUTO_ACKNOWLEDGE);if(session != null){//创建一个主题Topic messageTopic = session.createTopic(name);//创建消息发布者  MessageProducer messageProducer = session.createProducer(messageTopic);for (int i = 0; i < 5 ; i++) {TextMessage  t = session.createTextMessage("ActiveMQ发布消息:" + i);messageProducer.send(t);}session.commit();}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {ActiveMQpubsubProducter.sendMessages("topicDemo");}
}

3.2,订阅者

----------------------------订阅者1----------------------------

/*** * @类名称:ActiveMQpubsubComsumer1* @类描述:订阅者1-发布订阅模型*/
public class ActiveMQpubsubComsumer1 {//会话对象private static Session session = null;public static void getMessages(String name){try {session = ActiveMQLinkUtil.initConnection(false, Session.AUTO_ACKNOWLEDGE);if(session != null){Topic topic = session.createTopic(name);//创建消费者  MessageConsumer messageConsumer = session.createConsumer(topic);//注册消息监听  messageConsumer.setMessageListener(new MyListener1());}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {ActiveMQpubsubComsumer1.getMessages("topicDemo");}
}

----------------------------订阅者2----------------------------

/*** * @类名称:ActiveMQpubsubComsumer2* @类描述:订阅者2-发布订阅模型*/
public class ActiveMQpubsubComsumer2 {//会话对象private static Session session = null;public static void getMessages(String name){try {session = ActiveMQLinkUtil.initConnection(false, Session.AUTO_ACKNOWLEDGE);if(session != null){Topic topic = session.createTopic(name);//创建消费者  MessageConsumer messageConsumer = session.createConsumer(topic);//注册消息监听  messageConsumer.setMessageListener(new MyListener2());}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {ActiveMQpubsubComsumer2.getMessages("topicDemo");}
}

3.3,监听类

----------------------------订阅者1-监听类----------------------------

/*** * @类名称:MyListener1* @类描述:订阅者1-监听类*/
public class MyListener1 implements MessageListener {@Overridepublic void onMessage(Message message) {try {System.out.println("订阅者一,收到的消息:" + ((TextMessage)message).getText());//签收
            message.acknowledge();} catch (JMSException e) {e.printStackTrace();}}
}

----------------------------订阅者2-监听类----------------------------

/*** * @类名称:MyListener2* @类描述:订阅者2-监听类*/
public class MyListener2 implements MessageListener {@Overridepublic void onMessage(Message message) {try {System.out.println("订阅者二,收到的消息:" + ((TextMessage)message).getText());//签收
            message.acknowledge();} catch (JMSException e) {e.printStackTrace();}}
}

四,测试

在点对点的要先启动生产者,生产者要生产消息。而发布订阅模型,要先启动订阅者,订阅者先订阅topic,再发布消息。

第一步:运行ActiveMQpubsubComsumer1,ActiveMQpubsubComsumer2

第二步:运行ActiveMQpubsubProducter

五,结果

ActiveMQpubsubComsumer1:

ActiveMQpubsubComsumer2:

ActiveMQpubsubProducter:

ActiveMQ控制台截图:

Number Of Consumers

在该队列上还有多少消费者在等待接受消息。

Messages Dequeued

消费了多少条消息,记做C。

Messages Enqueued

生产了多少条消息,记做P。

发布者发布了5条数据,但是出队的有10条,因为有两个订阅者。

六,总结

发布者向一个特定的消息主题发布消息,0或者多个订阅者可能接收到来自特定消息主题的消息感兴趣。其中发布者和订阅者不知道对方的存在。

转载于:https://www.cnblogs.com/Zender/p/9101003.html

3,ActiveMQ-入门(基于JMS发布订阅模型)相关推荐

  1. google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...

    前言 在很多互联网应用系统中,请求处理异步化是提升系统性能一种常用的手段,而基于消息系统的异步处理由于具备高可靠性.高吞吐量的特点,因而在并发请求量比较高的互联网系统中被广泛应用.与此同时,这种方案也 ...

  2. kafka 发布订阅_在Kafka中发布订阅模型

    kafka 发布订阅 这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 ). 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现. 卡夫卡概念 根据官方文件 ...

  3. 在Kafka中发布订阅模型

    这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 ). 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现. 卡夫卡概念 根据官方文件 : Kafka是一种分 ...

  4. java实现rabbitmq发布/订阅模型(Publish/Subscribe queues), 生产者 消费者 交换机 消息队列

    发布/订阅模型又称扇出模型,或者是广播模型,可以有多个消费者,每个消费者有自己的队列,每个队列都要绑定到交换机,生产者发送的消息只需要发送到交换机,再由交换机决定要发送到哪些队列,生产者无法自行决定. ...

  5. 分布式发布订阅模型网络的实现有哪些

    大数据中常用的分布式发布订阅系统: 参考资料: WCF百科介绍 分布式"消息发布者-订阅者"模型的实现--WCF双工通讯特性的应用 [设计模式] 观察者模式(发布-订阅/Publi ...

  6. ros 单向通讯 talker,listener 发布订阅模型

    原文链接: ros 单向通讯 talker,listener 发布订阅模型 上一篇: VirtualBox 端口转发(端口映射) 主机和虚拟机相互访问 下一篇: python 串口编程 发布订阅模型 ...

  7. vue发布订阅模式,发布订阅模型

    1.什么是发布订阅模式 (又叫做观察者模式) 他定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都将得到通知. 2.发布订阅模型 1.发布者会给订阅者提供一个方法以便 ...

  8. ActiveMQ入门 (三) JMS消息组成

    ActiveMQ入门 (三) JMS消息组成 文章目录 ActiveMQ入门 (三) JMS消息组成 一.JMS协议组成结构 二.JMS Message消息组成 1.JMS消息头 2.JMS消息体 1 ...

  9. activemq 开启监听_SpringBoot集成ActiveMQ怎么实现Topic发布/订阅模式通信?

    上一期我们讲了SpringBoot集成activeMQ实现Queue模式点对点通信,这一期我们接着讲SpringBoot集成activeMQ实现Topic发布/订阅模式通信. 发布/订阅模式通信是对点 ...

最新文章

  1. 权力的游戏登录显示服务器上限,权力与纷争登录不了怎么办_权力与纷争服务器连不上解决办法_玩游戏网...
  2. 成功解决''g++' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  3. strcpy_s与strcpy对照
  4. CUDA入门需要知道的东西
  5. jmeter正则中常见的转义字符-笔记三
  6. DB: 20 个数据库设计最佳实践
  7. python怎么输出文件_python如何输出文件内容
  8. 高等数学(第七版)同济大学 总习题八 个人解答
  9. 2种方式!带你快速实现前端截图
  10. ae 渲染 计算机内存不足,AE内存不足怎么办? After Effects内存不足【解决方法】...
  11. MyBatis详解(一):入门程序
  12. 串口通信 数据采集软件 上位机 数据采集软件,可以采集plc,串口通信设备,tcp通信设备的数据
  13. 《从零开始的 RPG 游戏制作教程》第十二期:刷怪与防守(上)
  14. PCL安装与配置(Windows10+VS2017+pcl1.8.1 )
  15. 华为以太网链路聚合Eth-Trunk实验
  16. 微信朋友圈会在服务器上保留多久,微信朋友圈设置多久可见,暴露了你的为人...
  17. 正则表达式 REGEXP_REPLACE
  18. 使用poi将数据导出到excel
  19. 不用第三方之C#实现大容量报表系统(转)
  20. 函数的返回值——数组返回

热门文章

  1. parted如何将磁盘所有空间格式化_linux文件系统及磁盘格式化
  2. python html模板_Tempy-纯Python语法的HTML模板库
  3. mysql在windows启动_MySQL笔记:mySQL在windows环境启动
  4. android view 存值,使用ViewModel保存数据
  5. 地脚螺钉直径系列_机械系统通用件——螺栓、螺钉和螺柱国家标准
  6. 让R与Python共舞
  7. laravel database.php,php Laravel框架学习(一) 之 建立数据库并填充测试数据
  8. android 中的 gridview 的用法
  9. c++ list遍历_List集合就这么简单「源码剖析」
  10. SourceInsight初学使用笔记