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

ActiveMQ 入門實戰:從安裝部署到生產消費完整指南

     編輯:Java 綜合教學

一、認識 ActiveMQ:不只是框架,更是消息服務器

很多初學者誤以為 ActiveMQ 是類似 Spring、Netty 的框架,實際上它更像 Tomcat 這樣的服務器:

  • 使用前必須先啟動服務進程
  • 實現了 JMS(Java Message Service)規範,如同 Tomcat 實現 Servlet 規範
  • 客戶端通過網絡協議(TCP/HTTP)與其通信

二、環境搭建(Linux / Windows 通用)

Linux 快速部署

# 1. 下載
wget https://apache.freelamp.com/activemq/apache-activemq/5.4.2/apache-activemq-5.4.2-bin.tar.gz
# 2. 解壓
tar xvf apache-activemq-5.4.2-bin.tar.gz
# 3. 啟動
cd apache-activemq-5.4.2/bin
./activemq start
# 4. 驗證:瀏覽器訪問 https://localhost:8161

Windows 部署

官網下載穩定版壓縮包,解壓後雙擊 bin/win64/activemq.bat 啟動,同樣通過 https://localhost:8161 訪問管理控制台。

三、生產者發送消息完整代碼

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class SendMessage {
    private static final String BROKER_URL = "tcp://10.20.156.22:61616";
    private static final String QUEUE_NAME = "yunpeng.jiangyp";

    public void sendMessage() throws JMSException {
        // 1. 建立連接工廠
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
        // 2. 創建連接並啟動
        Connection connection = factory.createConnection();
        connection.start();
        // 3. 創建會話(非事務、自動確認)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4. 目標隊列
        Destination destination = session.createQueue(QUEUE_NAME);
        // 5. 創建生產者
        MessageProducer producer = session.createProducer(destination);
        // 6. 構建文本消息
        TextMessage message = session.createTextMessage("<hello>world!</hello>");
        // 7. 發送
        producer.send(message);
        // 8. 關閉資源
        connection.close();
    }

    public static void main(String[] args) throws JMSException {
        new SendMessage().sendMessage();
    }
}

驗證:發送成功後,訪問 https://10.20.156.22:8161/admin/queues.jsp 控制台,可見隊列 yunpeng.jiangyp 消息數增加。

四、消費者接收消息完整代碼

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class ReceiveMessage {
    private static final String BROKER_URL = "tcp://10.20.156.22:61616";
    private static final String QUEUE_NAME = "yunpeng.jiangyp";

    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory 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);

        while (true) {
            // 1秒超時輪詢
            Message message = consumer.receive(1000);
            if (message == null) break;
            if (message instanceof TextMessage) {
                TextMessage textMsg = (TextMessage) message;
                System.out.println("收到消息: " + textMsg.getText());
            }
        }
        connection.close();
    }
}

五、核心模式對比:PTP vs Pub/Sub

JMS 定義兩種消息傳遞模型:

特性Point-to-Point (Queue)Publish/Subscribe (Topic)
消費者數量多個,但每條消息只被一個消費者處理多個,每條消息被所有訂閱者處理
時間依賴無,消費者隨時可拉取有,訂閱者必須在線才能收到
典型場景任務分發、負載均衡廣播通知、事件驅動

本文示例使用 session.createQueue() 屬於 PTP 模式;若需發布訂閱,改用 session.createTopic() 即可。

六、生產環境關鍵提示

  • 連接復用:Connection 建立開銷大,應用級單例復用
  • 異步消費:實現 MessageListener 接口配合 consumer.setMessageListener(),避免輪詢阻塞
  • 持久化配置:重要業務設置 DeliveryMode.PERSISTENT 防消息丟失
  • 集群高可用:Master-Slave 或 Network of Brokers 架構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved