Apache ActiveMQ 消息队列深度解析与实践指南
1. Apache ActiveMQ 架构分析
Apache ActiveMQ 是一个开源的消息中间件,实现了JMS(Java Message Service)规范。其核心架构包含以下组件:
graph TD
A[Client Applications] -->|Produce/Consume| B[ActiveMQ Broker]
B --> C[Persistence Adapter]
B --> D[Transport Connectors]
B --> E[Message Stores]
C --> F[KahaDB/LevelDB/JDBC]
D --> G[TCP/SSL/NIO/VM]
E --> H[Queue]
E --> I[Topic]
主要组件说明:
- Broker: 消息代理核心,负责消息路由和传递
- Transport Connectors: 网络传输协议支持(TCP, SSL, NIO等)
- Persistence Adapter: 消息持久化存储(KahaDB, LevelDB, JDBC等)
- Message Stores: 队列(Queue)和主题(Topic)存储
2. ActiveMQ 生产者实现原理
生产者核心工作流程:
- 创建ConnectionFactory
- 建立Connection
- 创建Session
- 创建MessageProducer
- 发送消息
核心代码实现:
// 创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 创建连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目标队列
Destination destination = session.createQueue("TEST.QUEUE");
// 创建生产者
MessageProducer producer = session.createProducer(destination);
// 创建并发送消息
TextMessage message = session.createTextMessage("Hello ActiveMQ!");
producer.send(message);
3. ActiveMQ 消费者实现原理
消费者核心工作流程:
- 创建ConnectionFactory
- 建立Connection
- 创建Session
- 创建MessageConsumer
- 注册消息监听器或同步接收
核心代码实现:
// 创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 创建连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目标队列
Destination destination = session.createQueue("TEST.QUEUE");
// 创建消费者
MessageConsumer consumer = session.createConsumer(destination);
// 注册消息监听器
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
System.out.println("Received: " + ((TextMessage) message).getText());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
});
4. Spring Boot 集成 ActiveMQ 生产者示例
4.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
4.2 配置application.yml
spring:
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
packages:
trust-all: true
4.3 生产者服务实现
@Service
public class MessageProducerService {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(String destination, String message) {
jmsTemplate.convertAndSend(destination, message);
}
// 发送带属性的消息
public void sendMessageWithProperties(String destination, String message, Map<String, Object> headers) {
jmsTemplate.convertAndSend(destination, message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws JMSException {
for (Map.Entry<String, Object> entry : headers.entrySet()) {
message.setObjectProperty(entry.getKey(), entry.getValue());
}
return message;
}
});
}
}
5. Spring Boot 集成 ActiveMQ 消费者示例
5.1 消费者配置类
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> queueListenerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("3-10");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
@Bean
public ConnectionFactory connectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL("tcp://localhost:61616");
connectionFactory.setUserName("admin");
connectionFactory.setPassword("admin");
return connectionFactory;
}
}
5.2 消息监听器
@Component
public class MessageConsumer {
@JmsListener(destination = "TEST.QUEUE", containerFactory = "queueListenerFactory")
public void receiveMessage(TextMessage message) throws JMSException {
System.out.println("Received <" + message.getText() + ">");
message.acknowledge(); // 手动确认
}
// 支持消息转换
@JmsListener(destination = "OBJECT.QUEUE")
public void receiveObjectMessage(Order order) {
System.out.println("Received order: " + order);
}
}
6. ActiveMQ 生产者常用配置参数
| 参数 | 说明 | 示例值 |
|------|------|--------|
| deliveryMode | 消息传递模式(PERSISTENT/NON_PERSISTENT) | PERSISTENT |
| timeToLive | 消息存活时间(毫秒) | 60000 |
| priority | 消息优先级(0-9) | 5 |
| disableMessageID | 是否禁用消息ID | false |
| disableMessageTimestamp | 是否禁用消息时间戳 | false |
Spring JmsTemplate配置示例:
spring:
jms:
template:
delivery-mode: PERSISTENT
time-to-live: 60000
priority: 5
qos-enabled: true
7. ActiveMQ 消费者常用配置参数
| 参数 | 说明 | 示例值 |
|------|------|--------|
| acknowledgeMode | 确认模式(AUTO_ACKNOWLEDGE/CLIENT_ACKNOWLEDGE等) | CLIENT_ACKNOWLEDGE |
| subscriptionDurable | 是否持久化订阅 | true |
| messageSelector | 消息选择器表达式 | "JMSPriority > 5" |
| concurrency | 并发消费者数量 | "3-10" | | maxConcurrency | 最大并发数 | 10 |
Spring JMS监听器配置示例:
@JmsListener(
destination = "TEST.QUEUE",
containerFactory = "queueListenerFactory",
subscription = "mySubscription",
selector = "JMSPriority > 3"
)
public void receiveHighPriorityMessage(TextMessage message) {
// 处理高优先级消息
}
8. ActiveMQ 服务搭建方法
8.1 下载与安装
- 从官网下载最新版本:https://activemq.apache.org/components/classic/download/
- 解压到安装目录
8.2 基本配置
编辑 conf/activemq.xml
:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672"/>
</transportConnectors>
</broker>
8.3 用户认证配置
编辑 conf/users.properties
:
admin=admin
user=password
8.4 启动服务
# Linux/Mac
./bin/activemq start
# Windows
bin\activemq start
8.5 管理控制台
访问 http://localhost:8161/admin 使用配置的用户名密码登录
8.6 Docker 部署
docker run -p 61616:61616 -p 8161:8161 rmohr/activemq
总结
本文全面介绍了Apache ActiveMQ的核心架构、实现原理、Spring Boot集成方法以及生产实践中的关键配置。ActiveMQ作为成熟的消息中间件,在企业级应用中扮演着重要角色,理解其工作原理和最佳实践对于构建可靠的消息系统至关重要。