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;
                }
            }
        }


    }
}

 

posted @ 2020-04-10 17:22  指尖上的艺术  阅读(3265)  评论(0编辑  收藏  举报