目录
ActiveMQ 简介
1、ActiveMQ 是 Apache 推出的一款开源免费的,完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现的消息中间件(Message Oriented Middleware,MOM)
2、ActiveMQ 最主要的功能是实现 JMS Provider ,用来帮助实现高可用、高性能、可伸缩、易用和安全的企业级面向消息服务的系统。
ActiveMQ 官网:ActiveMQ
ActiveMQ 下载地址:ActiveMQ
3、ActiveMQ 特点/性:
完全支持 JMS1.1 和 J2EE 1.4 规范(持久化、XA消息、事物)
支持多种传输协议:in-VM,TCP,UDP,SSL,NIO,JGroup,JXTA
可插拔的体系结构,可以灵活定制,如:消息存储方式,安全管理等
可以轻松与 Application Server 集成使用,与 Spring 集成使用
支持多种语言编写客户端:如 Java、C、C++、C#、Ruby、Perl、Python、php、.net 等
从设计上保证了高性能的集群,客户端-服务端,点对点
支持通过 JDBC、Journal 提供高速的消息持久化
支持与 Axis 的整合。...
4、消息中间件(MOM)的基本功能是将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序。主要特点/特性:
消息异步接收,类似手机短信,信息发送者不需要等待信息接受者的响应,减少软件多系统集成的耦合度。
消息的可靠接收,确保消息在中间件可靠保存,只有接收方收到后才删除消息,多个消息也可以组成原子事物。
5、目前主流的消息中间件:Apache ActiveMQ、alibaba RocketMQ、Kafka、RabbitMQ、IBM MQServices、BEA WebLogic JMS Server、Oracle AQ、Tibco、SwiftMQ。
ActiveMQ 5.15.9 安装
1、官网地址 ActiveMQ 可以下载任意历史版本,本文以最新的 5.15.9 为例。
5.15.9 版本默认情况下启用 activemq 客户端 tls 主机名验证,这可能会导致与服务器主机名不匹配的服务器证书的客户端连接失败。请参阅 SSL 传输参考以了解配置,并参阅AMQ-7047以了解更多信息。
Description | Download Link | Verify |
---|---|---|
Windows Distribution | apache-activemq-5.15.9-bin.zip | ASC, SHA512 |
Unix/Linux/Cygwin Distribution | apache-activemq-5.15.9-bin.tar.gz | ASC, SHA512 |
2、对于 Maven 项目,可以使用 maven 3 获取二进制文件,可以在 maven pom.xml 中使用的最简单依赖项是:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
pom.xml · 汪少棠/active_mq_2 - Gitee.com
activemq-all 包含了所有的组件,如果只是需要其中某一部分功能,想要更细粒度的获取依赖,则可以从 activemq-client, activemq-broker, activemq-xx-store 等各种组件中进行选择。
3、根据系统需要可以下载 Windows 或 Linux 版本的二进制发行包,下载后直接解压拷贝到合适的地方即可,里面提供了开发包、运行程序、配置文件、文档、示例等等。
4、启动运行(嵌入式启动可以参考:ActiveMQ 命令行启动 与 嵌入式启动):
默认配置启动:进入 %ActiveMQ_HOME%/bin目录下,执行:activemq start (默认日志文件放在 data 目录下)
启动并指定日志文件:进入 %ActiveMQ_HOME%/bin目录下,执行:activemq start > ./activeMQLog.log
5、检查运行状态,ActiveMQ 默认采用 61616 端口提供 JMS 服务,使用 8161 端口提供管理控制台服务:
Windows 查看 61616 端口是否开启:netstat -ano |findstr 61616
Linux 查看 61616 端口是否开启:netstat -ano |grep 61616
可以直接查看控制台输出或者日志文件
可以直接访问 ActiveMQ 的 web 管理页面:http://localhost:8161/admin;默认账号密码是 admin/admin
6、关闭 ActiveMQ:
进入 %ActiveMQ_HOME%/bin目录下,执行:activemq stop
关闭启动窗口,程序也会退出
虽然不建议,但直接杀进程也是一种方式
ActiveMQ 基本使用
1、通俗的说 A 系统/应用可以将消息/数据 存储到 mysql 、redis 等数据库服务器上,B 系统/应用再从上面读取,也能起到中间件的作用,只是 ActiveMQ 可以看成是一个专门用于处理消息的数据库/服务器,消息生产者将消息发送给它,消息消费者再从 ActiveMQ 上读取。
2、正式因为 ActiveMQ 是专业的消息中间件,所以使用起来非常简单:
1)新建一个 Mava 管理的 Java SE 应用,在 pom.xml 文件导入上面的 activemq-all 依赖
2)然后新建一个生产者类(JmsSender)用于生产消息(消息会被发送到 ActiveMQ)
3)再新建一个消费者类(JmsReceiver)用于消费消息(会从 ActiveMQ 上读取消息)。
环境:Maven 3.6.1 + Java JDK 1.8 + ActiveMQ 5.15.9 + IDEA 2018
pom.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wmx</groupId>
<artifactId>activeMQ1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
</dependencies>
</project>
pom.xml · 汪少棠/active_mq_2 - Gitee.com
生产者(JmsSender)代码如下:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息发送者
*/
public class JmsSender {
public static void main(String[] args) {
Connection connection = null;
Session session = null;
try {
String brokerURL = "tcp://127.0.0.1:61616";//ActiveMQ 中间件连接地址
/**
* 创建 javax.jms.ConnectionFactory 连接工厂
* org.apache.activemq.ActiveMQConnectionFactory 中默认设置了大量的参数,还有几个重载的构造器可以选择
*/
ConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
//如果 ActiveMQ 连不上,则抛异常:java.net.ConnectException: Connection refused: connect
connection = mqConnectionFactory.createConnection();//通过连接工厂获取连接 javax.jms.Connection
connection.start();//启动连接,同理还有 stop、close
/**
* Session createSession(boolean transacted, int acknowledgeMode) 创建会话
* transacted :表示是否开启事务
* acknowledgeMode:表示会话确认模式
* AUTO_ACKNOWLEDGE 自动确认
* CLIENT_ACKNOWLEDGE 客户确认
* 还有 DUPS_OK_ACKNOWLEDGE、SESSION_TRANSACTED
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
/**
* createQueue(String queueName):创建消息队列,指定队列名称,消费者可以根据队列名称获取消息
* Destination 目的地,重点,interface Queue extends Destination
*/
Destination destination = session.createQueue("queue-app");
//createProducer(Destination destination):根据目的地创建消息生产者
MessageProducer producer = session.createProducer(destination);
int massageTotal = 5;
for (int i = 0; i < massageTotal; i++) {
//创建一个文本消息
TextMessage textMessage = session.createTextMessage("神州飞船 " + (i + 1) + " 号!");
producer.send(textMessage);//生产者发送消息
session.commit();//会话提交
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();//关闭会话
} catch (JMSException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();//关闭连接
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
src/main/java/com/wmx/active_mq_1/JmsSender.java · 汪少棠/active_mq_2 - Gitee.com
消费者(JmsReceiver)代码如下:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消费者
*/
public class JmsReceiver {
public static void main(String[] args) {
Connection connection = null;
Session session = null;
try {
String brokerURL = "tcp://127.0.0.1:61616";//ActiveMQ 中间件连接地址
/**
* 创建 javax.jms.ConnectionFactory 连接工厂
* org.apache.activemq.ActiveMQConnectionFactory 中默认设置了大量的参数,还有几个重载的构造器可以选择
*/
ConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
//如果 ActiveMQ 连不上,则抛异常:java.net.ConnectException: Connection refused: connect
connection = mqConnectionFactory.createConnection();//通过连接工厂获取连接 javax.jms.Connection
connection.start();//启动连接,同理还有 stop、close
/**
* Session createSession(boolean transacted, int acknowledgeMode) 创建会话
* transacted :表示是否开启事务
* acknowledgeMode:表示会话确认模式
* AUTO_ACKNOWLEDGE 自动确认
* CLIENT_ACKNOWLEDGE 客户确认
* 还有 DUPS_OK_ACKNOWLEDGE、SESSION_TRANSACTED
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
/**
* createQueue(String queueName):创建消息队列,指定队列名称,消费者可以根据队列名称获取消息
* Destination 目的地,重点,interface Queue extends Destination
*/
Destination destination = session.createQueue("queue-app");
//createProducer(Destination destination):根据目的地创建消息消费者
MessageConsumer consumer = session.createConsumer(destination);
int massageTotal = 5;
for (int i = 0; i < massageTotal; i++) {
TextMessage message = (TextMessage) consumer.receive();//消费者接收消息。因为对方发送的文本消息,所以可以强转
session.commit();//确认消息,告诉中间件,消息已经确认接收
System.out.println((i + 1) + ":" + message.getText());//获取消息文本
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();//关闭会话
} catch (JMSException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();//关闭连接
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
src/main/java/com/wmx/active_mq_1/JmsReceiver.java · 汪少棠/active_mq_2 - Gitee.com
测试如下
1、先启动 ActiveMQ 消息中间,然后运行消息发送者发送消息,此时 ActiveMQ web 控制台可以看到管理的消息队列,再运行消息消费者获取消息。