zoukankan      html  css  js  c++  java
  • 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)IBMWebSphere MQinamqmdnet.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;
                    }
                }
            }
    
    
        }
    }
  • 相关阅读:
    mod_rewrite
    敏捷开发
    转python和ruby的相同点
    ESB总线知识小结
    使用 squid 2.7 for windows 进行无缓存反向代理
    初探K2workflow
    没激情的工作
    多易拍 二次开发
    查看数二进制代码片段
    生成随机数
  • 原文地址:https://www.cnblogs.com/loda7023link/p/12674738.html
Copyright © 2011-2022 走看看