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

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

appProducerTopic代码:标红字体是做出了修改,由创建队列改为了创建主题。
package com.liu.jms;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class appProducerTopic {

    private static final String url = "tcp://127.0.0.1:61616";//actvemq的服务器tcp连接方式
private static final String topicName = "topic-test";//定义主题的名称 public static void main(String[] args) throws JMSException {
//1.创建connectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建connection
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建destination
Destination destination = session.createTopic(topicName);
//6.创建生产者
MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 100; i++) { TextMessage textMessage = session.createTextMessage("test" + i);
//7.发送消息
producer.send(textMessage); System.out.println("发送消息" + textMessage.getText()); }
//8.关闭连接
connection.close();
}
}
appConsumerTopic代码:标红字体是做出了修改,由创建队列改为了创建主题。
package com.liu.jms;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class appConsumerTopic {

    private static final String url = "tcp://127.0.0.1:61616";
private static final String topicName = "topic-test";//定义主题的名称 public static void main(String[] args) throws JMSException {
//1.创建connectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建connection
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建destination
Destination destination = session.createTopic(topicName);
//6.创建消费者
MessageConsumer consumer = session.createConsumer(destination);
//7.创建一个监听器
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message;
try {
System.out.println("接收到的消息:" + textMessage.getText()); } catch (JMSException e) {
e.printStackTrace();
}
}
});
//8.关闭连接(监听器是异步的还没有监听到消息的时候,就关闭连接了)
//connection.close();
}
}

  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. typecho视频播放插件JWPlayer

    JWplayer for typecho是羽中大神开发并持续维护的一款插件,目前插件已经发布了8个版本,涵盖typecho0.8到1.0,插件基于原生的JWPlayer,可以说非常完美,详细使用方法在 ...

  2. Linux shell 脚本总结

    在中括号中,判断变量的值, 加不加双引号的问题? -z 判断 变量的值,是否为空: zero = 0 - 变量的值,为空,返回0,为true - 变量的值,非空,返回1,为false -n 判断变量的 ...

  3. WX支付功能的调用

    1.引入js. 2.微信支付的js.此处有的理解不知对不对,是照着老大的例子整改的~ $('.button').click(function () { var giftId = $('.show'). ...

  4. centos + nginx + php-fpm +mysql的简单配置

    安装前准备 安装约定(这个根据自己习惯,可自行修改) 1.软件源码包我都下载到/usr/local/src这个目录下 2.软件一般都编译安装到/usr/local这个目录下 安装基础库 yum -y ...

  5. ionic3 安卓硬件返回

    platform.ready().then(() => { this.platform.registerBackButtonAction(() => { let activePortal ...

  6. eclipse编写连接MySQL的简单动态网页

    准备工作 下载Tomcat,建议使用最新版.下载并安装MySQL数据库,为了方便操作数据库,可以下载Navicat Premium,最新版不会提示不支持密码加密方式,所以下载最新版.除此之外,要想连接 ...

  7. [DIV+CSS] set the screen capture Part 1 (div截取屏幕)

    使用下面的代码来获取屏幕.用DIV加CSS 来控制. 使用mousemove来获取移动的时候DIV的变化, 效果图如下: 使用5个DIV来组成实现截图目的第一部分,现在只是实现了选择的第一部分. HT ...

  8. Java Spring Boot VS .NetCore (五)MyBatis vs EFCore

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. Make Eudict for reviewing example sentences

    Recently, I've started an activity of recording typical and nice English sentences from dictionaries ...

  10. python基础篇_003_函数

    python中的函数 1.函数的目的 .避免代码冗余 .增强可读性 2.函数的定义与调用 # 定义函数 使用关键字def """ 1.定义函数: def 函数名(): 函 ...