因为某单位是用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; } } } } }