前言

上篇博客《JMS实战——ActiveMQ》介绍了ActiveMQ的安装,并实现了简单的PTP模型。这篇博客我们来看一下Pub-Sub模型,之后来总结一下JMS。

实现

项目结构

其中,一个消息发布者Producer,两个接收者Consumer1、Consumer2,还有两个监听类Listener1和2,负责监听消费者是否收到消息。

消息生产者Producer

Producer类的代码实现跟上篇博客中的Sender类十分类似,但要注意的是,destination = session.createTopic(“TestTopic2”); 我们创建的是topic而不再是queue。

//消息个数
private static final int SEND_NUMBER = 10; public static void main(String[] args) {
//初始化开始,包括连接工厂、连接、会话、消息目的、消息生产者
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Destination destination;
MessageProducer producer; //创建连接工厂,使用默认用户名和密码。这里tcp://localhost:61616为连接地址,当然也可以使用默认地址。
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection(); // 启动
connection.start(); // 获取操作连接
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
//创建一个名称为TestQueue的消息队列
destination = session.createTopic("TestTopic2"); //得到producer
producer = session.createProducer(destination); // 构造消息
sendMessage(session, producer);
session.commit(); } catch (JMSException e) { e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
} private static void sendMessage(Session session, MessageProducer producer) throws JMSException { for (int i = 0; i < SEND_NUMBER; i++) {
TextMessage message=session.createTextMessage("I am a Producer"+i);
System.out.println("发送消息:"+message.getText());
producer.send(message);
}
}

消息的消费者Consumer

这里就不再给出全部代码了,但依然创建的是Topic,设置了消息监听Listener1。

         // 使用同一个消息队列
destination = session.createTopic("TestTopic2"); consumer=session.createConsumer(destination);
consumer.setMessageListener(new Listener1());

监听者Listener

public class Listener1 implements MessageListener{

    @Override
public void onMessage(Message message) {
try {
System.out.println("订阅者一收到消息:"+((TextMessage)message).getText());
} catch (Exception e) {
e.printStackTrace();
} } }

此处的MessageListener是jms包下提供的一个接口

package javax.jms;

/**
* @version $Rev: 467553 $ $Date: 2006-10-25 06:01:51 +0200 (Wed, 25 Oct 2006) $
*/
public interface MessageListener {
void onMessage(Message message);
}

测试

1 订阅

发布订阅模型要先执行订阅操作,依次执行Consumer1、Consumer2,之后在浏览器中查看Topic。

红框中显示已经存在2个Consumer。

2 发布

执行Producer,这里我们在代码中给出的10个消息。因为有2个订阅者,所以入队10个,出队20。

此时,我们的监听类Listener也发出了消息。查看控制台输出:



小结

ActiveMQ是基于JMS规范和J2EE规范的JMSProducer,也可以直接理解成是消息中间件。

1、与RMI、RPC相比,他的耦合性较小,更灵活。发布消息者往往不需要了解谁会收到消息,这与远程调用有着明显的不同。

2、再有,一般的调用是同步的、耗时的。而JMS是异步的,大大改善了用户体验。

JMS实战——ActiveMQ实现Pub-Sub的更多相关文章

  1. JMS实战——ActiveMQ

    安装 官网下载地址:http://activemq.apache.org/ 小编这里以5.9.0版本为例,做简单介绍. 下载之后解压到制定路径,目录结构如下: 启动 直接运行bin下的activemq ...

  2. JMS and ActiveMQ first lesson(转)

    JMS and ActiveMQ first lesson -- jms基础概念和应用场景 2011-6-18 PM 9:30 主讲:kimmking <kimmking@163.com> ...

  3. Java架构师系统培训高并发分布式电商实战activemq,netty,nginx,redis dubbo shiro jvm虚拟机视频教程下载

    15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...

  4. 深入浅出 JMS(二) - ActiveMQ 入门指南

    深入浅出 JMS(二) - ActiveMQ 入门指南 上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现-- Active ...

  5. 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

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

  6. 【JMS】JMS之ActiveMQ的使用

    这篇文章主要是简单介绍一下JMS和ActiveMQ,以及使用ActiveMQ来写两个demo. 1. JMS是啥 百度百科的解释: JMS即Java消息服务(Java Message Service) ...

  7. ActiveMQ第二弹:使用Spring JMS与ActiveMQ通讯

    本文章的完整代码可从我的github中下载:https://github.com/huangbowen521/SpringJMSSample.git 上一篇文章中介绍了如何安装和运行ActiveMQ. ...

  8. Simple guide to Java Message Service (JMS) using ActiveMQ

    JMS let’s you send messages containing for example a String, array of bytes or a serializable Java o ...

  9. spring集成JMS访问ActiveMQ

    首先我们搭建一个spring-mvc项目,项目可以参考:spring-mvc 学习笔记 步骤: 在pom.xml中加上需要的包 修改web.xml,增加IOC容器 spring配置文件applicat ...

随机推荐

  1. flask笔记(一)

    1.第一个flask项目 # 首先你要安装flask这个模块 pip install flask # 安装好了之后,直接新建一个py文件,开始写最简单的flask项目了 from flask impo ...

  2. rest_framework--序列化组件

    #####序列化组件##### 一.什么是序列化 在python中一切皆对象,把对象从内存中变成可存储或传输的过程称之为序列化. 你写一个django项目肯定是有前后端交互的吧,虽然django也可以 ...

  3. react.js中实现tab吸顶效果问题

    在react项目开发中有一个需求是,页面滚动到tab所在位置时,tab要固定在顶部. 实现的思路其实很简单,就是判断当滚动距离scrollTop大于tab距离页面顶部距离offsetTop时,将tab ...

  4. JS apply 和 call 的实现

    很早之前的一篇博客写了bind的实现,是基于apply的,感兴趣的朋友看完这篇文章可以接着看看bind的实现. apply 和 call 主要就是传参的区别.这里就不多说了,直接看代码. //call ...

  5. Easyui前端、JAVA后台 上传附件

    前端使用easyui框架,后台使用JAVA 的JFinal框架开发 功能描述:实现附件上传功能.文件上传路径为:../upload(上传文件夹)/身份证号/慢病编码/上传的附件. 细节要求:实现多图片 ...

  6. 【php学习-5】

    mutil_query($result)){ //多查询 where } //执行查询 /* $result=$cone->query("SELECT * from test" ...

  7. HTML自定义Checkbox框背景色

    input[type=checkbox]{ margin-right:5px; width:13px; height:13px; }input[type=checkbox]:after { width ...

  8. Python3.X-文本编码问题

    1.请说明python2与python3的默认编码是什么? python的默认编码是ASCII码,python3的默认编码是utf-8 2.为什么会出现中文乱码?能列举出现乱码的情况有哪几种么? 编码 ...

  9. CMDB介绍

    CMDB https://lupython.gitee.io/2018/05/05/CMDB%E4%BB%8B%E7%BB%8D/ 尚泽凯博客地址 传统运维与自动化运维的区别 传统运维: ​ 1.项目 ...

  10. 第四模块:网络编程进阶&数据库开发 考核实战

     1.什么是进程?什么是线程? 什么是协程? 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 线程:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 协程是一种用 ...