1.在这个项目中新增两个java类,主题生产者和主题消费者:

  2.和点对点的代码差别并不大,所以将消费者和生产者的分别代码拷入新增的java类中,再修改就好了。

  1. appProducerTopic代码:标红字体是做出了修改,由创建队列改为了创建主题。
  1. package com.liu.jms;
  2.  
  3. import org.apache.activemq.ActiveMQConnectionFactory;
  4.  
  5. import javax.jms.*;
  6.  
  7. public class appProducerTopic {
  8.  
  9. private static final String url = "tcp://127.0.0.1:61616";//actvemq的服务器tcp连接方式
  10. private static final String topicName = "topic-test";//定义主题的名称
  11.  
  12. public static void main(String[] args) throws JMSException {
  13. //1.创建connectionFactory
  14. ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
  15. //2.创建connection
  16. Connection connection = connectionFactory.createConnection();
  17. //3.启动连接
  18. connection.start();
  19. //4.创建session
  20. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  21. //5.创建destination
  22. Destination destination = session.createTopic(topicName);
  23. //6.创建生产者
  24. MessageProducer producer = session.createProducer(destination);
  25.  
  26. for (int i = 0; i < 100; i++) {
  27.  
  28. TextMessage textMessage = session.createTextMessage("test" + i);
  29. //7.发送消息
  30. producer.send(textMessage);
  31.  
  32. System.out.println("发送消息" + textMessage.getText());
  33.  
  34. }
  35. //8.关闭连接
  36. connection.close();
  37. }
  38. }
  1. appConsumerTopic代码:标红字体是做出了修改,由创建队列改为了创建主题。
  1. package com.liu.jms;
  2.  
  3. import org.apache.activemq.ActiveMQConnectionFactory;
  4.  
  5. import javax.jms.*;
  6.  
  7. public class appConsumerTopic {
  8.  
  9. private static final String url = "tcp://127.0.0.1:61616";
  10. private static final String topicName = "topic-test";//定义主题的名称
  11.  
  12. public static void main(String[] args) throws JMSException {
  13. //1.创建connectionFactory
  14. ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
  15. //2.创建connection
  16. Connection connection = connectionFactory.createConnection();
  17. //3.启动连接
  18. connection.start();
  19. //4.创建session
  20. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  21. //5.创建destination
  22. Destination destination = session.createTopic(topicName);
  23. //6.创建消费者
  24. MessageConsumer consumer = session.createConsumer(destination);
  25. //7.创建一个监听器
  26. consumer.setMessageListener(new MessageListener() {
  27. @Override
  28. public void onMessage(Message message) {
  29.  
  30. TextMessage textMessage = (TextMessage)message;
  31. try {
  32. System.out.println("接收到的消息:" + textMessage.getText());
  33.  
  34. } catch (JMSException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. });
  39. //8.关闭连接(监听器是异步的还没有监听到消息的时候,就关闭连接了)
  40. //connection.close();
  41. }
  42. }

  3.测试

  首先启动消费者这个java类,观察控制台,如下图:

  接着启动生产者的java类,观察控制台,如下图:生产了一百条消息。

  此时切换至消费的控制台,观察控制台,如下图:已经打印出了一百条消息了,说明消费者已经接受到全部一百条消息。

  6.打开activemq的控制台查看topics:(http://127.0.0.1:8161/admin/topics.jsp)如下图所示:有一个名字是我们设置的queue-test的主题,消费者也有一个就是我们创建的那个消费者类,主题中有一百条消息,被移除了一百条,也就是上面所说的,消费者接收到了这100条全部的消息。

  7.那么如果我启动了两个订阅相同的消费者呢?为了结果能清晰,重启activemq服务,关掉之前的Java类启动,然后启动两边消费者,再启动一个生产者。如下图:生产者生产了100条消息。

  8.分别看看两个消费者的接收消息,如下两张图:两个消费者都接受到了一模一样的100条消息。

  9.总结:主题订阅发布模式,有多个消费的订阅相同时,消费者不会相互相互影响,都会分别接收到生产者的全部消息。

学习ActiveMQ(三):发布/订阅模式(topic)演示的更多相关文章

  1. ACtiveMQ中间件-发布订阅模式

    前言:ActiveMQ学习心得 1.MQ是什么 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信, ...

  2. ActiveMQ (二)—发布订阅模式

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

  3. SpringBoot2.0之整合ActiveMQ(发布订阅模式)

    发布订阅模式与前面的点对点模式很类似,简直一毛一样 注意:发布订阅模式 先启动消费者 公用pom: <project xmlns="http://maven.apache.org/PO ...

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

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

  5. 【ActiveMQ】- 发布/订阅模式

    publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...

  6. 第三节: List类型的介绍、生产者消费者模式、发布订阅模式

    一. List类型基础 1.介绍 它是一个双向链表,支持左进.左出.右进.右出,所以它即可以充当队列使用,也可以充当栈使用. (1). 队列:先进先出, 可以利用List左进右出,或者右进左出(Lis ...

  7. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  8. RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)

    工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...

  9. ActiveMQ的p2p模式与发布订阅模式

    1.消息中间件:采用异步通讯防止,支持点对点以及发布订阅模式,可以解决高并发问题        传统调用接口,可能发生阻塞,重复提交,超时等等问题,可以利用消息中间件发送异步通讯请求          ...

随机推荐

  1. CF1139C Edgy Trees

    题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...

  2. Fast RCNN 中的 Hard Negative Mining

     Fast RCNN 中将与 groud truth 的 IoU 在 [0.1, 0.5) 之间标记为负例, [0, 0.1) 的 example 用于 hard negative mining. ...

  3. .Net三层架构

    .Net三层架构   希望朋友们留下自己对三层架构的理解... 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规 ...

  4. C#基础之Assembly

    一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承.多态.接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题: 1.凡树必有根和叶,类的 ...

  5. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程

    Spark2.1.1 一 Spark Submit本地解析 1.1 现象 提交命令: spark-submit --master local[10] --driver-memory 30g --cla ...

  6. 金蝶K3 WISE BOM多级展开_BOM成本表

    /****** Object: StoredProcedure [dbo].[pro_bobang_BOMCost] Script Date: 07/29/2015 16:09:11 ******/ ...

  7. beta冲刺5/7

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(5/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作中 数据集标注 接下来的计划 制作p ...

  8. elasticsearch单机部署多个节点

    cp -r elasticsearch-2.4.4 elasticsearch-2.4.4-2 mv elasticsearch-2.4.4 elasticsearch-2.4.4-1 总共cp了三个 ...

  9. Hadoop开启后jps显示只有jps

    之前在用Mapreduce写代码时,在DFS Location下的会报一个error,大体的意思就是与主机名相关的错误 然后我就觉得可能时Hadoop开启时出了错误,然后我就重启了Hadoop,jps ...

  10. 数组方括号有趣的split方法

    今天看到了split的方法感觉好神奇的样子 split是javascript内置方法 就像join方法是连接数组并转换为字符串一样split方法是把数组拆分成多个部分,而且每一个部分都是数组的元素. ...