環境準備
- 安裝 WebSphere MQ 並啟動隊列管理器(如
MQSI_SAMPLE_QM)
- 創建本地隊列(Local Queue,如
LQ)
- 定義服務連接通道(Server Connection Channel,如
BridgeChannel)
- 引入 MQ Client JAR:
com.ibm.mq.allclient.jar
核心流程
- 設置
MQEnvironment 連接屬性
- 連接隊列管理器
MQQueueManager
- 打開隊列
MQQueue(輸入模式)
- 配置
MQGetMessageOptions:同步點、等待、邏輯順序、組匹配
- 循環
queue.get(message, gmo) 接收分組消息
- 首條消息提取文件名屬性,創建
FileOutputStream
- 寫入消息體,檢測
MQGS_LAST_MSG_IN_GROUP 結束
- 提交事務
qmgr.commit(),異常回滾 qmgr.backout()
關鍵代碼片段
// 初始化連接
MQEnvironment.hostname = host;
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQQueueManager qmgr = new MQQueueManager(qmgrName);
int openOpts = MQOO_INPUT_AS_Q_DEF | MQOO_FAIL_IF_QUIESCING;
MQQueue inQueue = qmgr.accessQueue(queueName, openOpts, null, null, null);
// 獲取選項配置
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQGMO_FAIL_IF_QUIESCING | MQGMO_SYNCPOINT | MQGMO_WAIT;
gmo.waitInterval = 5000;
gmo.options |= MQGMO_ALL_MSGS_AVAILABLE | MQGMO_LOGICAL_ORDER;
gmo.matchOptions = MQMO_MATCH_GROUP_ID;
// 接收循環
MQMessage msg = new MQMessage();
FileOutputStream fos = null;
while (true) {
inQueue.get(msg, gmo);
if (fos == null) {
String fileName = msg.getStringProperty("fileName");
fos = new FileOutputStream(fileDir + rename(fileName));
}
byte[] buffer = new byte[msg.getMessageLength()];
msg.readFully(buffer);
fos.write(buffer);
if (gmo.groupStatus == MQGS_LAST_MSG_IN_GROUP) break;
msg.clearMessage();
}
fos.close();
qmgr.commit();
異常處理與資源釋放
MQException 捕獲後調用 backout() 回滾事務
finally 中關閉 FileOutputStream、MQQueue、MQQueueManager
- 配置屬性外部化(
MQConfig 讀取 properties 文件)
擴展建議
- 接收完成後觸發 Shell 腳本處理文件(解壓、解析、入庫)
- 集成 Spring JMS 簡化配置與異常處理
- 監控隊列深度、消息積壓告警
- 支持多實例併發消費(配置
MQOO_INPUT_SHARED)