Apache ActiveMQ 是流行的開源消息中間件,實現 JMS 1.1 規範。本文記錄 Windows/Linux 下載安裝、啟動管理控制台、創建 Queue、Eclipse 項目導入依賴、生產者/消費者代碼實現、驗證測試全流程,助你半小時跑通第一個 JMS 應用。
apache-activemq-5.18.0-bin.zip)。D:\activemq。# Windows
bin\activemq.bat start
# Linux/Mac
bin/activemq start
https://localhost:8161/admin/,默認帳號密碼 admin/admin。FirstQueue。<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.18.0</version>
</dependency>
<!-- 或 all-in-one -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.18.0</version>
</dependency>
從 activemq/lib 複製核心包到項目 lib/ 並 Add to Build Path:
package com.example.activemq;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Producer {
private static final String BROKER_URL = "tcp://localhost:61616";
private static final String QUEUE_NAME = "FirstQueue";
private static final int MSG_COUNT = 5;
public static void main(String[] args) throws JMSException {
// 1. 連接工廠
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
// 2. 建立連接並啟動
Connection connection = factory.createConnection();
connection.start();
// 3. 創建會話:非事務、自動確認
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4. 目標 Queue
Destination destination = session.createQueue(QUEUE_NAME);
// 5. 生產者
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 非持久化,僅演示
// 6. 發送消息
for (int i = 1; i <= MSG_COUNT; i++) {
TextMessage msg = session.createTextMessage("ActiveMQ 消息 " + i);
producer.send(msg);
System.out.println("已發送:" + msg.getText());
}
// 7. 關閉資源
producer.close();
session.close();
connection.close();
}
}
package com.example.activemq;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consumer {
private static final String BROKER_URL = "tcp://localhost:61616";
private static final String QUEUE_NAME = "FirstQueue";
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(QUEUE_NAME);
MessageConsumer consumer = session.createConsumer(destination);
System.out.println("等待消息... (Ctrl+C 停止)");
while (true) {
// 100 秒超時,演示用;生產用無限阻塞 receive()
Message msg = consumer.receive(100_000);
if (msg instanceof TextMessage) {
System.out.println("收到:" + ((TextMessage) msg).getText());
} else if (msg == null) {
System.out.println("超時無消息,退出");
break;
}
}
consumer.close();
session.close();
connection.close();
}
}
Consumer.main(控制台顯示「等待消息...」)。Producer.main(發送 5 條消息)。FirstQueue:Enqueued/Dequeued 均為 5,Messages 為 0。| 概念 | 說明 |
|---|---|
| ConnectionFactory | 創建 Connection 的工廠,線程安全,應用級單例 |
| Connection | 與 Broker 的 TCP 連接,較重,建議共享 |
| Session | 單線程上下文,生產/消費消息,事務邊界,非線程安全 |
| Destination | Queue (點對點) 或 Topic (發布訂閱) |
| MessageProducer/Consumer | 發送/接收消息的實體,由 Session 創建 |
| DeliveryMode | PERSISTENT(默認,寫磁盤) / NON_PERSISTENT(內存,高吞吐) |
| AcknowledgeMode | AUTO_ACKNOWLEDGE / CLIENT_ACKNOWLEDGE / DUPS_OK_ACKNOWLEDGE |
activemq-client 或 activemq-all 坐標版本一致。connection.start() 已調用(消費者必須啟動連接才能接收)。prefetchLimit。spring-boot-starter-activemq + @JmsListener 註解式消費。ActiveMQ 上手極快,核心 API 只有 ConnectionFactory → Connection → Session → Destination → Producer/Consumer 六步。掌握「非事務+自動確認」最簡模式後,再按業務需求引入持久化、事務、集群等高級特性。建議下一步:改造代碼使用 Spring JmsTemplate,體驗模板方法模式簡化資源管理。