关于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;

        /// <summary>
        /// 链接IBMMQ
        /// </summary>
        /// <param name="host">服务器地址</param>
        /// <param name="port">端口号</param>
        /// <param name="quemangername">队列管理器名称</param>
        /// <param name="queueName">队列名称</param>
        /// <param name="channel">通道号</param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="message"></param>
        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为字符编码,这个不对应的话,接收方收到的消息会乱码。

 

posted @   小毛备忘录  阅读(701)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示