关于C#对接IBMMQ


前有对接过Rabbitmq,觉得IBMMQ应该也问题不大,但是出乎意料的花费了不少的时间。

对方接收到的消息一直是乱码,后来瞄到MQ平台上一个参数,试着修改了一下,没想到还真是的这个参数引起,后面会提到。

最终还是成功调同,实属不易,在这记录一下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IBM.WMQ;

namespace PzhDataUpload.Base
{
    public static class Management
    {
        private static int CCSID = 1208;
        static string queueName;
        static MQQueueManager qMgr;
        static MQMessage mqMsg;
        static MQQueue queue;
        static MQPutMessageOptions putOptions;
        static string linkStatus;

        /// 
        /// 链接IBMMQ
        /// 
        /// 服务器地址
        /// 端口号
        /// 队列管理器名称
        /// 队列名称
        /// 通道号
        /// 
        public static string LinkToQueueManager(string host, int port, string quemangername, string queName, string channel)
        {
            if (!(qMgr == null || !qMgr.IsConnected))
            {
                return linkStatus;
            }
            string QueueName = queName;
            Management.queueName = QueueName;
            Environment.SetEnvironmentVariable("MQCCSID", "1381");
            if (MQEnvironment.properties.Count <= 0)
            {
                MQEnvironment.properties.Add(MQC.CCSID_PROPERTY, 1381);
            }
            MQEnvironment.Port = port;
            MQEnvironment.Channel = channel;
            MQEnvironment.Hostname = host;
            string qmName = quemangername;
            try
            {
                if (qMgr == null || !qMgr.IsConnected)
                {
                    qMgr = new MQQueueManager(qmName);
                }
                linkStatus = "连接队列管理器:" + "成功!";
            }
            catch (MQException e)
            {
                linkStatus = "连接队列管理器错误: 结束码:" + e.CompletionCode + " 错误原因代码:" + e.ReasonCode;
            }
            catch (Exception e)
            {
                linkStatus = "连接队列管理器错误: 结束码:" + e;
            }
            return linkStatus;
        }

        /// 
        /// 发送消息
        /// 
        /// 
        public static void SendMsg(string message)
        {
            int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE;
            try
            {
                queue = qMgr.AccessQueue(queueName, openOptions);   //尝试打开队列
            }
            catch (MQException e)
            {
                MessageBox.Show("打开队列失败:" + e.Message);
            }
            mqMsg = new MQMessage();
            mqMsg.Encoding = CCSID;
            mqMsg.CharacterSet = CCSID;
            mqMsg.WriteString(message);
            putOptions = new MQPutMessageOptions();
            try
            {
                queue.Put(mqMsg, putOptions);        //将消息放入消息队列
            }
            catch (MQException mqe)
            {
                MessageBox.Show("发送异常终止:" + mqe.Message);
            }
            finally
            {
                try
                {
                    qMgr.Disconnect();

                }
                catch (MQException e)
                {

                }
            }
        }
    }
}

有几点需要注意:

1:需要安装IBMMQ客户端。

2:需要引用安装目录下amqmdnet.dll这个DLL。

3:CCSID为字符编码,这个不对应的话,接收方收到的消息会乱码。

C