Apache ActiveMQ 消息队列深度解析与实践指南

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 生产者实现原理

生产者核心工作流程:

  1. 创建ConnectionFactory
  2. 建立Connection
  3. 创建Session
  4. 创建MessageProducer
  5. 发送消息

核心代码实现:

// 创建连接工厂
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 消费者实现原理

消费者核心工作流程:

  1. 创建ConnectionFactory
  2. 建立Connection
  3. 创建Session
  4. 创建MessageConsumer
  5. 注册消息监听器或同步接收

核心代码实现:

// 创建连接工厂
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 下载与安装

  1. 从官网下载最新版本:https://activemq.apache.org/components/classic/download/
  2. 解压到安装目录

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作为成熟的消息中间件,在企业级应用中扮演着重要角色,理解其工作原理和最佳实践对于构建可靠的消息系统至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值