因為某單位是用IBM.MQ服務作為對接平台,因此對接的話就要訂閱服務,並且從隊列中獲取最新消息。
1、所謂訂閱,就是讓服務提供商(一般就是這個平台的運維人員)為自己開通一個輸出隊列,如圖;
除此以外,要至少讓他們提供以下信息(以下紅色都是我舉例子的,一定要以實際的為准):
主機Host:192.168.1.1
端口Port:5000
通道Channel:IE.SVRCONN
隊列管理器名稱QueueManagerName:GWO.QM
2、必須安裝IBM.MQ的客戶端,我安裝的是V7.5.0.3,雖然Nuget里面是有WebSphereMqClient的8.0.0.7版本,但是安裝了調用會報錯。
3、安裝完后,創建一個.Net Framework 4.5控制台程序,添加引用包amqmdnet.dll,如果這里不安裝客戶端,直接上網下載一個dll是不行的,會出現很多依賴dll找不到的異常
C:\Program Files (x86)\IBM\WebSphere MQ\bin\amqmdnet.dll
4、最后,實現代碼,我這里做了一個最簡單的獲取隊列消息例子:
using IBM.WMQ; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IBM.MQ.Test { class Program { static void Main(string[] args) { //測試 var manager = new MyIBMQueueManager() { Host = "192.168.1.1", Port = 5000, Channel = "IE.SVRCONN", QueueManagerName = "GWO.QM", QueueName = "OUT.S301.XXXX.XX" }; manager.Connect(); manager.GetMessage(); Console.ReadLine(); } } public class MyIBMQueueManager { /// <summary> /// Host主機 /// </summary> public string Host { get; set; } /// <summary> /// 通道 /// </summary> public string Channel { get; set; } /// <summary> /// 端口 /// </summary> public int Port { get; set; } /// <summary> /// 隊列管理器名稱 /// </summary> public string QueueManagerName { get; set; } /// <summary> /// 輸出隊列名稱 /// </summary> public string QueueName { get; set; } public MQQueueManager QMgr { get; set; } public MyIBMQueueManager() { } public bool Connect() { Hashtable env = new Hashtable(); env.Add(MQC.HOST_NAME_PROPERTY, Host); env.Add(MQC.CHANNEL_PROPERTY, Channel); env.Add(MQC.PORT_PROPERTY, Port); try { QMgr = new MQQueueManager(QueueManagerName, env); Console.WriteLine("連接成功..."); return true; } catch (Exception ex) { Console.WriteLine("連接異常:" + ex.Message); return false; } } public void GetMessage() { try { int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT; MQMessage message = new MQMessage(); MQQueue queue = QMgr.AccessQueue(QueueName, openOptions); MQGetMessageOptions gmo = new MQGetMessageOptions(); gmo.Options = MQC.MQGMO_WAIT; gmo.WaitInterval = 30000; gmo.MatchOptions = MQC.MQMO_NONE; queue.Get(message, gmo); var result = message.ReadString(message.MessageLength); Console.WriteLine("消息內容:" + result); queue.Close(); } catch (MQException e2) { if (e2.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE) { Console.WriteLine("隊列中沒有消息或是已經取完"); } else if (e2.ReasonCode == MQC.MQRC_CHANNEL_NOT_AVAILABLE || e2.ReasonCode == MQC.MQRC_CONNECTION_BROKEN || e2.ReasonCode == MQC.MQRC_CONNECTION_ERROR || e2.ReasonCode == MQC.MQRC_CONNECTION_STOPPED || e2.ReasonCode == MQC.MQRC_Q_MGR_QUIESCING) { // 設定重新連接(接入廠商考慮重新連接設定) Connect(); Console.WriteLine("隊列管理器連接不可用,需要重新創建隊列管理器!"); } else { throw e2; } } } } }