C#對接IBM.MQ服務


因為某單位是用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;
                }
            }
        }


    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM