首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

ActiveMQ 入門實戰:從安裝到 Java 生產者/消費者完整代碼

     編輯:Java 相關知識

Apache ActiveMQ 是流行的開源消息中間件,實現 JMS 1.1 規範。本文記錄 Windows/Linux 下載安裝、啟動管理控制台、創建 Queue、Eclipse 項目導入依賴、生產者/消費者代碼實現、驗證測試全流程,助你半小時跑通第一個 JMS 應用。

1. 下載與安裝

  • 官網:activemq.apache.org 下載二進制包(如 apache-activemq-5.18.0-bin.zip)。
  • 解壓至無中文、無空格路徑,如 D:\activemq。

2. 啟動 Broker 與管理控制台

# Windows
bin\activemq.bat start

# Linux/Mac
bin/activemq start
  • 默認端口:61616 (OpenWire/JMS)、8161 (Web Console)。
  • 瀏覽器訪問 https://localhost:8161/admin/,默認帳號密碼 admin/admin。
  • 控制台創建 Queue:Queues → Create new queue → 名稱 FirstQueue。

3. Eclipse/Java 項目依賴配置

Maven 方式(推薦)

<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>

手動導入 JAR(舊版教程方式)

從 activemq/lib 複製核心包到項目 lib/ 並 Add to Build Path:

  • activemq-client-5.x.x.jar
  • activemq-broker-5.x.x.jar
  • geronimo-jms_1.1_spec-1.1.1.jar
  • geronimo-j2ee-management_1.1_spec-1.0.1.jar
  • slf4j-api-1.7.x.jar

4. 生產者代碼

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();
    }
}

5. 消費者代碼

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();
    }
}

6. 驗證測試步驟

  1. 先啟動 Consumer.main(控制台顯示「等待消息...」)。
  2. 再啟動 Producer.main(發送 5 條消息)。
  3. 觀察 Consumer 控制台依次輸出「收到:ActiveMQ 消息 1~5」。
  4. 登錄 Web Console 查看 FirstQueue:Enqueued/Dequeued 均為 5,Messages 為 0。

7. 關鍵概念速查

概念說明
ConnectionFactory創建 Connection 的工廠,線程安全,應用級單例
Connection與 Broker 的 TCP 連接,較重,建議共享
Session單線程上下文,生產/消費消息,事務邊界,非線程安全
DestinationQueue (點對點) 或 Topic (發布訂閱)
MessageProducer/Consumer發送/接收消息的實體,由 Session 創建
DeliveryModePERSISTENT(默認,寫磁盤) / NON_PERSISTENT(內存,高吞吐)
AcknowledgeModeAUTO_ACKNOWLEDGE / CLIENT_ACKNOWLEDGE / DUPS_OK_ACKNOWLEDGE

8. 常見問題與排查

  • 連接被拒絕:確認 Broker 啟動、端口 61616 未被佔用、防火牆放行。
  • ClassNotFound: ActiveMQConnectionFactory:依賴缺失,檢查 activemq-client 或 activemq-all 坐標版本一致。
  • 消費者收不到消息:檢查 Queue 名稱大小寫一致;確認 connection.start() 已調用(消費者必須啟動連接才能接收)。
  • 消息積壓:開啟持久化、增加消費者實例、調整 prefetchLimit。

9. 進階方向

  • Spring Boot 整合:spring-boot-starter-activemq + @JmsListener 註解式消費。
  • Topic 發布訂閱模式、持久化訂閱。
  • 消息可靠性:事務會話、手動確認、死信佇列 (DLQ)。
  • 集群高可用:Master/Slave、Replicated LevelDB、Network of Brokers。

總結

ActiveMQ 上手極快,核心 API 只有 ConnectionFactory → Connection → Session → Destination → Producer/Consumer 六步。掌握「非事務+自動確認」最簡模式後,再按業務需求引入持久化、事務、集群等高級特性。建議下一步:改造代碼使用 Spring JmsTemplate,體驗模板方法模式簡化資源管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved