《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/ActiveMQ/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

推荐阅读如下 ActiveMQ 文章:

1. 概述

ActiveMQApache 软件基金会所研发的开源的消息中间件。

  • ActiveMQ 是基于 Java 语言来进行实现的,因此只需要有 Java 环境,ActiveMQ 就可以方便的运行起来。
  • ActiveMQ 完全支持 JMS1.1 规范。

不过 ActiveMQ 相比目前主流的 RabbitMQ、Kafka、RocketMQ 等消息队列来说,性能是相对比较差的,所以目前互联网公司采用的非常少。也因此,在 ActiveMQ 官方 可以看到,其正在积极开发 ActiveMQ Artemis ,以最终替代现有的 ActiveMQ 版本。

Artemis 是一款基于 Netty NIO 的高性能消息中间件,它的前身为 JBoss 的 HornetQ,于 2015 年被捐献给 Apache ActiveMQ 社区,并命名为 Apache Artemis。

因为朋友已经写了一篇很不错的 ActiveMQ 入门文章,所以艿艿就可以光明正大的偷懒了。对 RabbitMQ 不了解的胖友,可以先阅读 《消息队列之 ActiveMQ》 文章的「1. 简介」小节

2. 单机部署

操作系统:macOS 10.14

其它系统,基本一致的。

注意,需要安装 JDK 。不同版本的 ActiveMQ 需要的 JDK 版本,见《Apache ActiveMQ 各个版本所依赖的 JDK 版本》文章。

2.1 下载

打开 ActiveMQ 下载页面,选择想要的 ActiveMQ 版本。这里,我们选择此时的最新版本 5.15.10 Release 。命令行操作如下:

# 创建目录
$ mkdir -p /Users/yunai/ActiveMQ
$ cd /Users/yunai/ActiveMQ

# 下载
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache//activemq/5.15.10/apache-activemq-5.15.10-bin.tar.gz

# 解压
$ tar -zxvf apache-activemq-5.15.10-bin.tar.gz
$ cd apache-activemq-5.15.10

# 查看目录
$ ls- ls
80 -rw-r--r-- 1 yunai staff 40580 Aug 28 15:47 LICENSE
8 -rw-r--r-- 1 yunai staff 3334 Aug 28 15:47 NOTICE
8 -rw-r--r-- 1 yunai staff 2610 Aug 28 15:47 README.txt
36208 -rwxr-xr-x 1 yunai staff 18536370 Aug 28 15:22 activemq-all-5.15.10.jar
0 drwxr-xr-x 10 yunai staff 320 Dec 14 20:30 bin # # 执行脚本
0 drwxr-xr-x 20 yunai staff 640 Aug 28 15:47 conf # 配置文件
0 drwxr-xr-x 3 yunai staff 96 Aug 28 15:47 data # 数据文件、日志文件
0 drwxr-xr-x 5 yunai staff 160 Aug 28 15:47 docs # 文档
0 drwxr-xr-x 7 yunai staff 224 Aug 28 15:47 examples # 使用示例
0 drwxr-xr-x 22 yunai staff 704 Dec 14 20:30 lib # ActiveMQ jar 包
0 drwxr-xr-x 8 yunai staff 256 Aug 28 15:47 webapps # ActiveMQ 管理后台
0 drwxr-xr-x 3 yunai staff 96 Dec 14 20:30 webapps-demo

2.2 启动

启动一个 ActiveMQ Broker 服务。命令行操作如下:

# 启动 ActiveMQ Broker 服务。
$ bin/macosx/activemq start
Starting ActiveMQ Broker...

启动完成后,查看日志。命令行操作如下:

# 查看 ActiveMQ Broker 日志。
$ tail -f data/wrapper.log

INFO | jvm 1 | 2019/12/14 20:38:58 | INFO | Apache ActiveMQ 5.15.10 (localhost, ID:MacBook-Pro-8-61548-1576327136884-0:1) started

😈 至此,我们已经完成了 ActiveMQ 单机部署。因为 ActiveMQ 暂未提供消息的发送和消费的脚本,所以我们只能在「5. 简单示例」中,使用 Java 代码来实现消息的发送和消费的测试。

3. 集群部署

咳咳咳,偷懒下。胖友可以先看如下文章:

在生产环境下,必须搭建 ActiveMQ 高可用集群,不然简直是找死。

4. ActiveMQ Web Console

ActiveMQ 自带 Web Console 插件,提供 ActiveMQ 的 Web 管理界面。

The ActiveMQ Web Console is a web based administration tool for working with ActiveMQ.

4.1 启动 Web Console

「2. 单机部署」中,默认就已经启动了 ActiveMQ Web Console ,无需特别去启动。

4.2 简单使用

使用浏览器,访问 http://127.0.0.1:8161/admin/ 地址,我们就可以看到 Web Console 的界面。

因为我们未登录,所以会弹出用户密码输入框。默认情况下,我们可以使用用户名为 admin ,密码为 admin 进行登录。

登录完成后,进入如下界面:ActiveMQ Web Console

从图中,我们可以看到 ActiveMQ 中的一些基本概念,例如每个菜单分别是:

  • Home:查看 ActiveMQ Broker 的整体信息。
  • Queues:查看和管理 ActiveMQ 的 Queue 队列。
  • Topics:查看和管理 ActiveMQ 的 Topic 主题。
  • Subscribers:查看和管理 Topic 主题的订阅者。
  • Connections:查看和管理 ActiveMQ 客户端的连接。
  • Network:查看 ActiveMQ 的网络信息。
  • Scheduled:查看 ActiveMQ 的定时任务。
  • Send:通过 Form 表单,使用 JMS API 发送消息到 Queue 队列、或 Topic 主题。

更多具体的功能,胖友可以自己多多体验,艿艿就不啰嗦赘述了。

5. 简单示例

示例代码对应仓库:lab-32-activemq-native

在 JMS 规范中,定义了两种消息模型:

  • 点对点(point to point):基于 Queue 队列的方式。
  • 发布/订阅(publish/subscribe):基于 Topic 主题的方式。

具体的概念,艿艿就先不解释,胖友可以看看《消息队列两种模式:点对点与发布订阅》文章。

本小节,我们将使用点对点的消息模式,一起来看看在 Java 中,如何使用生产者 Producer 发送消息,和消费者 Consumer 消费消息。

另外,ActiveMQ 的 Java 客户端是遵守 JMS 规范来实现的,所以在稍后的示例中,我们也能看到这一点。

5.1 引入依赖

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">
<parent>
<artifactId>lab-32</artifactId>
<groupId>cn.iocoder.springboot.labs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>lab-32-activemq-native</artifactId>

<dependencies>
<!-- 引入 ActiveMQ 客户端依赖 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.15.10</version>
</dependency>
</dependencies>

</project>

具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。

5.2 ActiveMQProducer

创建 ActiveMQProducer 类,使用 JMS MessageProducer 发送消息。代码如下:

// ActiveMQProducer.java

import org.apache.activemq.ActiveMQConnectionFactory; // 使用 ActiveMQ 的客户端实现

import javax.jms.*; // 使用 JMS API

public class ActiveMQProducer {

private static final String BROKER_URL = "tcp://127.0.0.1:61616";
private static final String USERNAME = "admin";
private static final String PASSWORD = "admin";

private static final String QUEUE_NAME = "queue_demo"; // 只有 QUEUE_NAME 需要共享给 RabbitMQConsumer

public static void main(String[] args) throws JMSException {
// 创建连接
Connection connection = getConnection();

// 创建会话
Session session = getSession(connection);

// 创建队列
Queue queue = getQueue(session);

// 创建 Producer
MessageProducer producer = session.createProducer(queue);

// 发送 3 条消息
for (int i = 0; i < 3; i++) {
Message message = session.createTextMessage("Hello World" + i);
producer.send(message);
}

// 关闭
session.close();
connection.close();
}

public static Connection getConnection() throws JMSException {
// 创建连接
ConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
Connection connection = factory.createConnection();
// 启动连接
connection.start();
return connection;
}

public static Session getSession(Connection connection) throws JMSException {
// 第一个方法参数 transacted ,是否开启事务。这里设置为 false ,无需开启
// 第二个方法参数 acknowledgeMode ,确认模式。这里设置为 AUTO_ACKNOWLEDGE ,自动确认。推荐阅读 https://my.oschina.net/thinwonton/blog/995291
return connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}

public static Queue getQueue(Session session) throws JMSException {
return session.createQueue(QUEUE_NAME);
}

}

  • 代码比较简单,胖友根据艿艿添加的注释,理解下哈。

执行 #main(args) 方法,发送 3 条消息到 ActiveMQ 。如果没有报错,说明执行正常成功。

5.3 ActiveMQConsumer

创建 ActiveMQConsumer 类,使用 JMS MessageConsumer 消费消息。代码如下:

// ActiveMQConsumer.java

import javax.jms.*; // 使用 JMS API

import java.util.concurrent.TimeUnit;

public class ActiveMQConsumer {

public static void main(String[] args) throws JMSException {
// 创建连接
Connection connection = ActiveMQProducer.getConnection();

// 创建会话
final Session session = ActiveMQProducer.getSession(connection);

// 创建队列
Queue queue = ActiveMQProducer.getQueue(session);

// 创建 Consumer
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {

public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(String.format("[线程:%s][消息编号:%s][消息内容:%s]",
Thread.currentThread(), textMessage.getJMSMessageID(), textMessage.getText()));
} catch (JMSException e) {
throw new RuntimeException(e);
}
}

});

// 关闭
try {
TimeUnit.HOURS.sleep(1);
} catch (InterruptedException ignore) {
}
session.close();
connection.close();
}

}

  • 代码比较简单,胖友根据艿艿添加的注释,理解下哈。

执行 #main(args) 方法,从 RabbitMQ 消费消息。执行结果如下:

[线程:Thread[ActiveMQ Session Task-1,7,main]][消息编号:ID:MacBook-Pro-8-53110-1576335483269-1:1:1:1:1][消息内容:Hello World0]
[线程:Thread[ActiveMQ Session Task-1,7,main]][消息编号:ID:MacBook-Pro-8-53110-1576335483269-1:1:1:1:2][消息内容:Hello World1]
[线程:Thread[ActiveMQ Session Task-1,7,main]][消息编号:ID:MacBook-Pro-8-53110-1576335483269-1:1:1:1:3][消息内容:Hello World2]

  • 消费成功,符合预期。

如果胖友想看发布/订阅的消息模式的示例,可以看看《消息队列之 ActiveMQ》「2. 工程实例」小节。

6. Spring Boot 使用示例

《芋道 Spring Boot 分布式消息队列 ActiveMQ 入门》 中,我们来详细学习如何在 Spring Boot 中,整合并使用 ActiveMQ 。😈 会方便很多。

7. Spring Cloud 使用示例

《芋道 Spring Cloud 消息队列 ActiveMQ 入门》 中,我们来详细学习如何在 Spring Cloud 中,整合并使用 Kafka 。😈 更加方便。

666. 彩蛋

暂无彩蛋,美滋滋。

ActiveMQ 的资料并不多,暂时的一本书《ActiveMQ in Action》 还没中文翻译版。

文章目录
  1. 1. 1. 概述
  2. 2. 2. 单机部署
    1. 2.1. 2.1 下载
    2. 2.2. 2.2 启动
  3. 3. 3. 集群部署
  4. 4. 4. ActiveMQ Web Console
    1. 4.1. 4.1 启动 Web Console
    2. 4.2. 4.2 简单使用
  5. 5. 5. 简单示例
    1. 5.1. 5.1 引入依赖
    2. 5.2. 5.2 ActiveMQProducer
    3. 5.3. 5.3 ActiveMQConsumer
  6. 6. 6. Spring Boot 使用示例
  7. 7. 7. Spring Cloud 使用示例
  8. 8. 666. 彩蛋