在上一篇《ActiveMQ入门系列二:入门代码实例(点对点模式)》中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式。

一、理论基础

发布/订阅模式的工作示意图:

  • 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息。
  • 和点对点方式不同,发布到topic的消息会被所有订阅者消费。
  • 当生产者发布消息,不管是否有消费者,都不会保存消息。
  • 一定要先有消息的消费者,后有消息的生产者。

二、代码实现

  1. 生产者

    package com.sam.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/*** @author JAVA开发老菜鸟**/
    public class TopicProducer {public static final  String QUEUE_NAME = "topic-demo";//队列名public void producer(String message) throws JMSException {ConnectionFactory factory = null;Connection connection = null;Session session = null;MessageProducer producer = null;try {/*** 1.创建连接工厂* 创建工厂,构造方法有三个参数:分别是用户名、密码、连接地址* 无参构造:有默认的连接地址,localhost* 一个参数:无验证模式,无用户的认证* 三个参数:有认证和连接地址*/factory = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");/*** 2.创建连接* 无参数* 有参数:用户名、密码*/connection = factory.createConnection();/*** 3.启动连接* 生产者可以不启动,因为在发送消息的时候回进行检查* 如果未启动连接,会自动启动* 如果有特殊配置,需要配置完成后再启动连接*/connection.start();/*** 4.用连接创建会话* 有两个参数:是否需要事务、消息确认机制* 如果支持事务,对于生产者来说第二个参数就无效了,建议传入Session.SESSION_TRANSACTED* 如果不支持事务,第二个参数必须传递且有效** AUTO_ACKNOWLEDGE:自动确认,消息处理后自动确认(商业开发不推荐)* CLIENT_ACKNOWLEDGE:客户端手动确认,消费者处理后必须手动确认* DUPS_OK_ACKNOWLEDGE:有副本的客户端手动确认,消息可以多次处理(不建议)*/session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);/*** 5.用会话创建目的地(主题)、生产者、消息* 队列名是队列的唯一标记* 创建生产者的时候可以不指定目的地,可以在发送的时候指定*/Destination destination = session.createTopic(QUEUE_NAME);producer = session.createProducer(destination);TextMessage textMessage = session.createTextMessage(message);/*** 6.生产者发送消息到目的地*/producer.send(textMessage);System.out.println("消息发送成功");} catch(Exception ex){throw ex;} finally {/*** 7.释放资源*/if(producer != null){producer.close();}if(session != null){session.close();}if(connection != null){connection.close();}}}public static void main(String[] args){TopicProducer producer = new TopicProducer();try{producer.producer("hello, activemq");} catch (Exception ex){ex.printStackTrace();}}
    }

    发布/订阅模式的生产者和点对点模式的代码主要区别就是Destination的创建方式,点对点模式是调用session.createQueue(QUEUE_NAME),而发布/订阅模式是调用session.createTopic(QUEUE_NAME)。

  2. 消费者
    package com.sam.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;
    import java.io.IOException;/*** @author JAVA开发老菜鸟** 观察者消费--监听消费*/
    public class TopicConsumer {public void consumer() throws JMSException, IOException {ConnectionFactory factory = null;Connection connection = null;Session session = null;MessageConsumer consumer = null;try {factory = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");connection = factory.createConnection();/*** 消费者必须启动连接,否则无法消费*/connection.start();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createTopic(TopicProducer.QUEUE_NAME);consumer = session.createConsumer(destination);/*** 注册监听器,队列中的消息变化会自动触发监听器,接收并自动处理消息** 监听器一旦注册,永久有效,一直到程序关闭* 监听器可以注册多个,相当于集群* activemq自动轮询多个监听器,实现并行处理*/consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {try {TextMessage om = (TextMessage) message;String data = om.getText();System.out.println(data);} catch (JMSException e) {e.printStackTrace();}}});} catch(Exception ex){throw ex;}}public static void main(String[] args){TopicConsumer consumer = new TopicConsumer();try{consumer.consumer();} catch (Exception ex){ex.printStackTrace();}}
    }

    消费者在点对点监听消费的基础上进行变化,主要区别有两个:1.同生产者一样,也是Destination的创建方式不同; 2.消息无需手动确认,直接采用自动确认机制

代码写完了,接下来进行测试,由于subscribe可以有多个,而且每个都可以消费到相同的消息,因此我们消费者启动两个。

先执行生产者

在控制台页面的Topics下出现了我定义的topic并且有1条消息发送成功且未消费

然后执行两个消费者,两个消费者都没有消费到任何消息

并且,控制台页面只是多了2个消费者,已经消费的消息还是0

为什么呢?还记得前面的理论基础说的吗?就是这个原因

继续,我们在两个消费者启动好的前提下,再执行生产者, 这个时候会发现两个消费者都消费了该消息

再看下控制台页面

已消费消息这里是2,这个2并不是说之前发的两个消息都消费了,而是说第二个消息消费了2次, 1 * 2 = 2

不信的话,可以再执行一遍生产者,这个时候就是4,而不是3

累计发送过3条消息,消息消费了4次,这里的4就是后面两条分别被消费了2次, 2 * 2 = 4

三、两种模式比较

好,到这里,发布/订阅模式就介绍完了。

如果有收获,就点个赞呗

转载于:https://www.cnblogs.com/sam-uncle/p/10990324.html

ActiveMQ入门系列三:发布/订阅模式相关推荐

  1. RabbitMQ入门学习系列(四) 发布订阅模式

    什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道消息发送到队列 ...

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

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

  3. ActiveMQ入门系列二:入门代码实例(点对点模式)

    在上一篇<ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)>中,大致介绍了ActiveMQ和一些概念,并下载.安装.启动他,还访问了他的控制台页面. 这篇,就用代 ...

  4. RabbitMQ 服务异步通信 -- 入门案例(消息预存机制)、SpringAMQP、发布订阅模式(FanoutExchange、DirectExchange、TopicExchange)、消息转换器

    文章目录 1. 入门案例 2. 完成官方Demo中的hello world案例 2.1 创建1个工程,2个模块 2.1.1 父工程的依赖,子工程不需要导入额外的依赖 2.1.2 配置子工程的配置文件( ...

  5. ActiveMQ发布订阅模式

    ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...

  6. 设计模式(三):观察者模式与发布/订阅模式区别

    在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe)模式,也有人认为这两种模式还是存在差异,而我认为确实是存在差异的,本质上的区别是调度的地方 ...

  7. 小话设计模式三:发布/订阅模式

    发布/订阅模式定义: 又称为观察者模式,定义对象间的一种一对多的依赖关系,一个发布者可以对应多个订阅者,当发布者发生变化的时候,他可以将消息一一通知给所有的订阅者当一个对象的状态发生改变时,所有依赖于 ...

  8. 【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)

    2019独角兽企业重金招聘Python工程师标准>>> j360-boot spring-boot入门工程之j360-boot:(欢迎star.fork) https://githu ...

  9. 从东京奥运会看js设计模式之发布订阅模式

    开篇废话:本篇文章介绍发布-订阅模式,想必很多人听说过有一种观察者模式,网上既有资料说这是两种不同的设计模式,也有说这是一种模式,我倾向于认同他们是同一种设计模式.不必过于纠结 开篇楔子:东京奥运会已 ...

  10. c#事件的发布-订阅模型_C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命...

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

最新文章

  1. 工程打包是什么意思_承包工程是什么意思
  2. C# winfrom 通过代码 删除TableLayoutPanel控件的一行或列
  3. 《单页Web应用:JavaScript从前端到后端》——1.4 小结
  4. 监控聚币网行情 并实时发送到微信
  5. SaaS系列介绍之十一: SaaS商业模式分析
  6. 刚学计算机先学什么好,计算机语言入门先学什么?
  7. 作者:程学旗,中国科学院计算技术研究所研究员、所长助理、副总工程师。...
  8. java图形界面_学习Java有什么用?Java的应用领域有哪些?
  9. oracle帮助文档_Spring Boot Config文档,使用IntelliJ IDEA的两种方法
  10. java中10个用户注册_JavaWeb(十)Session
  11. VS 母版使用配置技巧
  12. Linux系统中 安装Vmware Toolst工具
  13. 小灰的算法之旅python篇pdf_漫画算法 小灰的算法之旅 Python篇
  14. BC26接入电信平台
  15. 怎么访问vmware虚拟机IIS网站
  16. 面经——嵌入式常见面试题总结100题(下)
  17. 游戏服务器是干什么的(大话、浅析)
  18. linux 数据库 函数是什么,MySQL数据库函数(一)
  19. 基于图像识别测试手机浏览器打开网页首屏时间的方法
  20. 【男人不可以穷】下载

热门文章

  1. Spring Cloud Alibaba Nacos集群和持久化配置
  2. 完全卸载MySQL 数据库——清空MySql注册表
  3. 洛谷P2257 YY的GCD(莫比乌斯反演)
  4. Kudu:支持快速分析的新型Hadoop存储系统
  5. 【转】阿里巴巴性能测试规划思路
  6. linux基本命令操作(二)
  7. ubuntu下Qt cannot find -lGL错误的解决方法
  8. SERVER 2008 +MSSQL2008+SCCM安装记录
  9. touch 创建一个普通文件或更新已有文件的时间
  10. 华为手机投屏电脑_手机投屏干货分享:华为如何投屏到电视机?