JMS实战——ActiveMQ实现Pub-Sub
前言
上篇博客《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的更多相关文章
- JMS实战——ActiveMQ
安装 官网下载地址:http://activemq.apache.org/ 小编这里以5.9.0版本为例,做简单介绍. 下载之后解压到制定路径,目录结构如下: 启动 直接运行bin下的activemq ...
- JMS and ActiveMQ first lesson(转)
JMS and ActiveMQ first lesson -- jms基础概念和应用场景 2011-6-18 PM 9:30 主讲:kimmking <kimmking@163.com> ...
- Java架构师系统培训高并发分布式电商实战activemq,netty,nginx,redis dubbo shiro jvm虚拟机视频教程下载
15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...
- 深入浅出 JMS(二) - ActiveMQ 入门指南
深入浅出 JMS(二) - ActiveMQ 入门指南 上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现-- Active ...
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- 【JMS】JMS之ActiveMQ的使用
这篇文章主要是简单介绍一下JMS和ActiveMQ,以及使用ActiveMQ来写两个demo. 1. JMS是啥 百度百科的解释: JMS即Java消息服务(Java Message Service) ...
- ActiveMQ第二弹:使用Spring JMS与ActiveMQ通讯
本文章的完整代码可从我的github中下载:https://github.com/huangbowen521/SpringJMSSample.git 上一篇文章中介绍了如何安装和运行ActiveMQ. ...
- 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 ...
- spring集成JMS访问ActiveMQ
首先我们搭建一个spring-mvc项目,项目可以参考:spring-mvc 学习笔记 步骤: 在pom.xml中加上需要的包 修改web.xml,增加IOC容器 spring配置文件applicat ...
随机推荐
- Angularjs基础(十二)
ng-model-options 描述:规定如何更新模型 实例: 在失去焦点时绑定输入框的值scope 变量中. <div ng-app="myApp" ng-control ...
- Sass 基础(五)
@if @if 指令是一个SassScript,它可以根据条件处理样式块,如果条件为true返回一个样式块,反之 false 返回另一个样式块,在Sass 中除了@if之,还可以配合@else if和 ...
- jqPaginator分页插件
如下图效果: 官方地址:http://jqpaginator.keenwon.com/ java后台代码Page对象: /** * * All Rights Reserved. 保留所有权利. */ ...
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
- 介绍三种PHP加密解密算法
PHP加密解密算法 这里主要介绍三种常用的加密解密算法:方法一: /** * @param $string 要加密/解密的字符串 * @param string $operation 类型,ENCOD ...
- redis 带入的挖矿病毒 qW3xT.2 wnTKYg 解决方法
最近我的阿里云ecs 老是收到 云盾态势感知系统检测到异常 top -c 后发现一个 疑似病毒 /tmp/qW3xT.2 看到网友们的解决方案 试过之后效果不错,可以用的 知道wnTKYg是什么鬼之 ...
- STM32(4)——系统时钟和SysTick
1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...
- html 弹框 优化 alert
<!DOCTYPE html> <html> <head> <title>cs</title> </head> <styl ...
- (数据科学学习手札07)R在数据框操作上方法的总结(初级篇)
上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框的常用方法进行总结: 1.数据框的生成 ...
- Hue 工具使用
Hue 是一个 Web 接口的 Hadoop 分析数据工具,由 Cloudra 公司开源 官方网址 Github 地址 -> 安装方法 文档地址 一.Build 1.ubuntu安装所需环境(以 ...