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

WebSphere MQ 分散式傳輸環境搭建與 Java 客戶端測試實戰:雙機器跨隊列管理器訊息路由完整指南

     編輯:Java 相關知識

架構拓撲與規劃

雙機器環境模擬生產級 MQ 分散式部署:

項目機器 A (發送端)機器 B (接收端)
代碼/主機名0000000088888888
IP 位址10.1.1.110.1.1.2
隊列管理器QM_00000000QM_88888888
本地隊列LQ_00000000LQ_88888888
傳輸隊列XQ_88888888XQ_00000000
遠程隊列定義RQ_88888888 → LQ_88888888@QM_88888888RQ_00000000 → LQ_00000000@QM_00000000
發送方通道00000000.88888888 (TCP 10.1.1.2:1414)88888888.00000000 (TCP 10.1.1.1:1414)
接收方通道88888888.0000000000000000.88888888
伺服器連接通道DC.SVRCONN (客戶端連接用)

MQ 物件建立詳細步驟 (WebSphere MQ Explorer)

機器 A 配置

  1. 建立隊列管理器 QM_00000000,預設設定
  2. 建立本地隊列 LQ_00000000
  3. 建立傳輸隊列 XQ_88888888(用法選「傳輸」)
  4. 建立遠程隊列定義 RQ_88888888:
    • 遠程隊列名稱:LQ_88888888
    • 遠程隊列管理器:QM_88888888
    • 傳輸隊列:XQ_88888888
  5. 建立發送方通道 00000000.88888888:
    • 傳輸類型:TCP/IP
    • 連接名稱:10.1.1.2(1414)
    • 傳輸隊列:XQ_88888888
  6. 建立接收方通道 88888888.00000000(預設)
  7. 建立伺服器連接通道 DC.SVRCONN(預設)

機器 B 配置 (鏡像對稱)

隊列管理器 QM_88888888、本地隊列 LQ_88888888、傳輸隊列 XQ_00000000、遠程隊列 RQ_00000000 指向機器 A、發送方通道 88888888.00000000 連接 10.1.1.1(1414)、接收方通道 00000000.88888888、伺服器連接通道 DC.SVRCONN。

通道啟動與狀態驗證

# 兩台機器分別啟動發送方通道
# 狀態應顯示 "RUNNING" (正在運行)
# 若為 RETRYING/STOPPED,檢查:
# 1. 防火牆 1414 埠
# 2. 通道名稱雙向完全一致 (大小寫敏感)
# 3. 傳輸隊列名稱拼寫
# 4. 遠程隊列管理器名稱拼寫

Java 客戶端測試程式 (機器 A 發送)

import java.io.IOException;
import java.util.Hashtable;
import com.ibm.mq.*;

public class MQTest {
    private static String qmName = "QM_00000000";
    private static String qName = "RQ_88888888";  // 遠程隊列定義
    private static MQQueueManager qMgr;
    private static Hashtable props = new Hashtable();

    public static void main(String[] args) {
        try {
            // 連接屬性配置
            props.put("hostname", "10.1.1.1");        // 本機 IP (客戶端連接本機 QM)
            props.put("port", new Integer(1414));
            props.put("channel", "DC.SVRCONN");       // 伺服器連接通道
            props.put("CCSID", new Integer(1381));    // 字符集:GB18030/中文
            props.put("transport", "MQSeries");       // 傳輸類型

            // 建立連接
            qMgr = new MQQueueManager(qmName, props);

            // 開啟遠程隊列 (OUTPUT 權限 = 16)
            int openOptions = MQConstants.MQOO_OUTPUT;
            MQQueue remoteQ = qMgr.accessQueue(qName, openOptions);

            // 建立訊息
            MQMessage putMessage = new MQMessage();
            putMessage.writeUTF("Test Message from Machine A");

            // 發送選項
            MQPutMessageOptions pmo = new MQPutMessageOptions();

            // 放入隊列
            remoteQ.put(putMessage, pmo);
            System.out.println("Message sent to Remote Queue successfully");

            // 清理資源
            remoteQ.close();
            qMgr.disconnect();

        } catch (MQException ex) {
            System.err.println("MQ Error: CC=" + ex.completionCode + ", RC=" + ex.reasonCode);
            // 常見代碼:2035 (權限)、2058 (QM 名稱錯誤)、2059 (連接失敗)
        } catch (IOException ex) {
            System.err.println("Message buffer error: " + ex);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

驗證測試結果

  1. 機器 A 執行上述程式
  2. 機器 B 的 WebSphere MQ Explorer 中查看 LQ_88888888 本地隊列
  3. 右鍵 →「瀏覽訊息」→ 應看到 "Test Message from Machine A"
  4. 訊息屬性中 MsgId、CorrelId、PutDate/PutTime 正常即成功

進階主題與生產環境強化

訊息持久化保證

MQMessage msg = new MQMessage();
msg.persistence = MQConstants.MQPER_PERSISTENT;  // 預設即持久化
// 需確保隊列定義 DEFPSIST(YES)

異常處理與死信隊列 (DLQ)

  • 配置隊列管理器 DEADQ(QM_DLQ)
  • 監控 DLQ 深度告警
  • 實作 DLQ 處理程式定期重試/人工干預

通道安全強化

  1. SSL/TLS:通道屬性啟用 SSLCIPH、配置金鑰庫
  2. 通道認證記錄 (CHLAUTH):MQ 7.1+ 支援 IP/用戶映射規則
  3. 訊息加密:應用層 AES 加密敏感欄位

高可用架構:多實例隊列管理器 / MQ 叢集

  • 多實例 QM:共享檔案系統 (GPFS/NFS) + 浮動 IP,自動故障轉移
  • MQ 叢集:自動負載均衡、動態路由、無單點故障

效能調優關鍵參數

參數建議值說明
BATCHSZ50-100通道批次大小,減少網路往返
BATCHLIM1000 KB批次位元組限制
HBINT300心跳間隔(秒),檢測斷連
MAXMSGL4MB-100MB最大訊息長度,視業務而定
NPMSPEEDFAST非持久訊息快速模式

常見故障排查速查表

現象可能原因排查步驟
通道狀態 RETRYING網路不通/防火牆/通道名不符ping/telnet 1414、核對通道名大小寫、檢查錯誤日誌 AMQERR*.LOG
MQException 2035權限不足檢查通道 MCAUSER、CHLAUTH、用戶是否在 mqm 群組
訊息發送成功但接收端無訊息遠程隊列定義錯誤/傳輸隊列未啟用檢查 RQ 定義的 RQMNAME、XMITQ、XQ 狀態、XQ 深度
中文亂碼CCSID 不匹配雙端統一 CCSID 1381 (GB18030) 或 1208 (UTF-8)

總結

WebSphere MQ 分散式傳輸的核心在於「名稱精確對稱」:通道名雙向一致、隊列管理器名稱精確匹配、傳輸隊列與遠程隊列定義形成閉環。本文提供從基礎設施配置、Java 客戶端測試、驗證方法到生產級強化的完整鏈路。掌握此模式,即可構建高可靠、高效能、安全合規的企業級訊息總線基礎設施。

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