深入浅出 JMS(二) - ActiveMQ 入门指南
深入浅出 JMS(二) - ActiveMQ 入门指南
上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现—— ActiveMQ。ActiveMQ 是一个易于使用的消息中间件。
一、消息中间件和 ActiveMQ
(1) 消息中间件(MOM:Message Orient middleware)
我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件有很多的用途和优点:
- 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
- 负责建立网络通信的通道,进行数据的可靠传送;
- 保证数据不重发,不丢失;
- 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务。
(2) ActiveMQ
首先简单的介绍一下 MQ,MQ 英文名 MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。
下面进入我们今天的主题,为大家介绍 ActiveMQ。
Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4.
ActiveMQ 是由 Apache 出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
下面我们下载一个版本,玩一玩。
二、运行 ActiveMQ 服务
(1) 下载,解压缩
ActiveMQ 下载网站:http://activemq.apache.org/activemq-5153-release.html
大家现在好之后,将 apache-activemq-5.15.3-bin.zip 解压缩,我们可以看到它的整体目录结构:
从它的目录来说,还是很简单的:
- bin:存放的是脚本文件
- conf:存放的是基本配置文件
- data:存放的是日志文件
- docs:存放的是说明文档
- examples:存放的是简单的实例
- lib:存放的是 activemq 所需 jar 包
- webapps:用于存放项目的目录
(2) 启动 ActiveMQ
我们了解 activemq 的基本目录,下面我们运行一下 activemq 服务,双击 bin 目录下的 bin/win64/activemq.bat 脚本文件,就可以看下图的效果。
从上图我们可以看到 activemq 的存放地址,以及浏览器要访问的地址。
(3) 测试
ActiveMQ 默认使用的 TCP 连接端口是 61616, 通过查看该端口的信息可以测试 ActiveMQ 是否成功启动
netstat -an | find "61616"
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING
(4) 监控
ActiveMQ 默认启动时,启动了内置的 jetty 服务器,提供一个用于监控 ActiveMQ 的 admin 应用。地址:http://127.0.0.1:8161/admin/
用户名和密码都是 admin
三、ActiveMQ 特性列表
- 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持 JMS1.1 和 J2EE 1.4 规范 (持久化,XA消息,事务)
- 对 Spring 的支持,ActiveMQ 可以很容易内嵌到使用 Spring 的系统里面去,而且也支持 Spring2.0 的特性
- 通过了常见 J2EE 服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过 JCA 1.5 resource adaptors 的配置,可以让 ActiveMQ 可以自动的部署到任何兼容 J2EE 1.4 商业服务器上
- 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通过 JDB C和 journal 提供高速的消息持久化
- 从设计上保证了高性能的集群,客户端-服务器,点对点
- 支持 Ajax
- 支持与 Axis 的整合
- 可以很容易得调用内嵌 JMS provider,进行测试
四、什么情况下使用 ActiveMQ
多个项目之间集成
- 跨平台
- 多语言
- 多项目
降低系统间模块的耦合度,解耦
- 软件扩展性
系统前后端隔离
- 前后端隔离,屏蔽高安全区
五、ActiveMQ 快速入门
们首先写一个简单的 Hello World 示例,让大家感受下 Activemq,我们需要实现接受者和发送者两部分代码的编写。
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.3</version>
</dependency>
(1) 生产者
public class Producer {
public static void main(String[] args) throws JMSException {
//1. 创建 ConnectionFactory 连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory( // (1)
//ActiveMQConnectionFactory.DEFAULT_USER,
//ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"admin", "password",
"tcp://localhost:61616/"
);
//2. 创建 connection,并启动连接
Connection connection = factory.createConnection(); // (2)
connection.start();
//3. Session 是一个发送或接收消息的线程
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // (3)
//4. 指定生产消息目标禾消费消息来源的 Destination 对象
Destination dest = session.createQueue("queue1"); // (4)
//5. 创建生产者
MessageProducer producer = session.createProducer(dest); // (5)
//6. 指定签收模式
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // (6)
//7. 创建消息
for (int i = 0; i < 10; i++) { // (7)
TextMessage message = session.createTextMessage("aaaaaaaaaaaaaaa");
producer.send(message);
}
if (connection != null) {
connection.close();
}
}
}
创建 ConnectionFactory 实例,ActiveMQConnectionFactory 构造函数传入三个参数,分别是用户名,密码,消息地址,tcp 端口可以在 conf/activemq.xml 中配制。
创建 connection,并启动连接,Connection 默认是关闭的。注意:使用结束后要关闭
connection.close()
。创建 session 会话,一个 connection 可以创建多个 session,Session 是一个发送或接收消息的线程。
参数1:是否开启事务,如果开启事务,则在必须提交 session
for (int i = 0; i < 10; i++) { // (7)
TextMessage message = session.createTextMessage("aaaaaaaaaaaaaaa");
producer.send(message);
}
session.commit();
参数2:签收模式,有
Session.AUTO_ACKNOWLEDGE
(自动)、Session.CLIENT_ACKNOWLEDGE
(手动 常用)、Session.DUPS_OK_ACKNOWLEDGE
(可能重复签收),如若选择Session.CLIENT_ACKNOWLEDGE
,则必须在消费端确认,否则 ActiveMQ 不认为消息已经消费。生产中一般使用Session.CLIENT_ACKNOWLEDGE
签收,不要相信自动签收方式。# 客户端处理
TextMessage message = (TextMessage) consumer.receive();
message.acknowledge();
通过 session 创建 Destination 对象,指定生产消息目标禾消费消息来源的对象。在 PTP 模式中 Destination 被称作 Queue 即队列;在 Pub/sub 模式 Destination 被称作 Topic 即主题,在程序中可以使用多个 Queue 和 Top。
创建消息的发送和接收对象(生产者和消贵者) MessageProducer/MessageConsumer
指定签收模式。使用 MessageProducer 的 setDeliveryMode 方法为其设置持久化特性和非持久化特性(DeliveryMode)
发送消息。使用 JMS 规范的 TextMessage 形式创建数据(通过 session 对象),并且 MessageProducer 的 send 方法发送数据。同理客户端使用 receive 方法进行接收数据。最后不要忘记关闭 Connection 连接。
public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive)
destination
可以指定将不同的消息发送到不同的 destination,但消费端就必须指定对应的 destinationdeliveryMode
是否开启持久化,默认为持久性,DeliveryMode.NON_PERSISTENT
、DeliveryMode.PERSISTENT
priority
优先级 0-9,默认为 4,优先级越高越先消费,概率timeToLive
ActiveMQ 中消息保留的时间,单位秒,默认永久保存
(2) 消费者
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Consumer {
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616/"
);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination dest = session.createQueue("queue1"); // (1)
MessageConsumer consumer = session.createConsumer(dest);
while (true) {
TextMessage message = (TextMessage) consumer.receive();
//message.acknowledge();
if (message == null)
break;
System.out.println(message.getText());
}
if (connection != null) {
connection.close();
}
}
}
- 消费端与生产者大同小异,注意对应的参数最好设定为一致。必须从对应的 Destination 取出数据,否则无法取到数据。
深入浅出 JMS(二) - ActiveMQ 入门指南的更多相关文章
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- 深入浅出 JMS(三) - ActiveMQ 安全机制
深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...
- 深入浅出 JMS(四) - ActiveMQ 消息存储
深入浅出 JMS(四) - ActiveMQ 消息存储 一.消息的存储方式 ActiveMQ 支持 JMS 规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被 ...
- ActiveMQ - 入门指南
首先需要下载ActiveMQ,下面的链接给我们列出了所有版本: http://activemq.apache.org/download-archives.html 每个版本为不同的OS提供了链接: 公 ...
- Pilosa文档翻译(二)入门指南
目录 开始 Pilosa 简单项目 创建架构(Create the Schema) 从CVS文件导入数据 做一些查询(Queries) 接下来做什么? Pilosa支持默认使用JSON的HTTP接口. ...
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- 深入浅出 JMS(三) - ActiveMQ 消息传输
深入浅出 JMS(三) - ActiveMQ 消息传输 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker ...
- ActiveMQ入门系列二:入门代码实例(点对点模式)
在上一篇<ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)>中,大致介绍了ActiveMQ和一些概念,并下载.安装.启动他,还访问了他的控制台页面. 这篇,就用代 ...
随机推荐
- 在oracle下如何创建database link全面总结
物理上存放于网络的多个ORACLE数据库,逻辑上可以看成一个单一的大型数据库,用户可以通过网络对异地数据库中的数据进行存取,而服务器之间的协同处理对于工作站用户及应用程序而言是完全透明的,开发人员无需 ...
- 20180201之Burp Suite Professional V1.7.31 相关英文翻译
Burp Suite Professional V1.7.31 打嗝 套件 专业
- 一,Android Studio笔记
转自:https://developer.android.com/studio/intro/index.html 一.界面 Android Studio 主窗口由图 3 标注的几个逻辑区域组成. 工具 ...
- 查看shell环境下,网络是否连通-curl/ping
检查网络是否可用 curl www.baidu.com <!--STATUS OK--><html>...</html> ping www.baidu.com注意: ...
- WindowBrush
m_Element.Fill = SystemColors.WindowBrush; BorderBrush="{x:Static SystemColors.WindowBrush}&quo ...
- H5-BLOB
BLOB 对象为h5的产物.普遍用于传输或者存储数据. <a 标签的新属性 download 表明 此a标签点击后,不是href跳转而是要下载.download的内容表示下载文件名.但是目前部分 ...
- jdk免安装对应配置
通常我们不用配置jdk,tomcat和eclipse会选取系统的环境变量获取jdk,但有时一个系统中部署不同的项目,各版本又不一样,不能完全兼容. 因此就需要采用自己的jdk.将jdk安装后,将安装后 ...
- UI5-文档-2.4-Node.js-Based开发环境
用于修改OpenUI5.环境是基于Node.js,用作服务器,具有一个基于Grunt的构建过程.本节提供关于初始设置.开发工作流和测试执行的信息. 常规开发过程: 不需要构建过程,您可以简单地修改任何 ...
- gulp 用法 小结
前端们,gulp该用起来了,简单的demo入门 gulp.grunt前端自动化工具,只有用过才知道多么重要. 作者:一文不提来源:博客园|2015-05-28 10:35 移动端 收藏 分享 gulp ...
- mongodb基础学习2-基本CRUD
接着学习一下mongodb的基本的CRUD 先列出基本知识点,再给出相关的例子 增:语法: db.collectionName.insert(document); 1: 增加单篇文档,不指定_id时会 ...