背景:
做XX项目需要把交易的消息推送给YY系统,技术选型MQ
另:选用MQ原因是为了防止YY系统宕机,无法接受收消息
实现
1、安装IBM WebSphere MQ客户端
2、引用amqmdnet.dll(在客户端的安装目录下可以找到)
3、C#代码如下
1 /* 2 * write by:wjf 3 * date:2015-05-20 4 * dec:MQ操作客户端 5 * 6 */ 7 using System; 8 using System.Diagnostics; 9 using System.IO; 10 using IBM.WMQ; 11 12 namespace RsaTest 13 { 14 public class IbmMQClient : IDisposable 15 { 16 // 定义MQ 服务器的IP 地址; 17 private string hostname = "182.180.80.241"; 18 //private const string hostname = "182.180.80.243"; 19 //MQ侦听端口号 20 //private const int port = 54221; 21 private readonly int port; 22 // 设置队列打开选项为可存放; 23 private const int openOptions = MQC.MQOO_OUTPUT; // MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT; 24 25 // 队列管理器; 26 private readonly MQQueueManager qManager; 27 //队列名称 28 private readonly string qName; 29 // 定义MQ 服务器连接通道的名称; 30 private readonly string channel; 31 // 定义队列管理器的名称; 32 //private string qManagerName; 33 34 public IbmMQClient(string qManagerName, string channel, string qName, string sPort, string hostname) 35 { 36 //this.qManagerName = qManagerName; 37 this.channel = channel; 38 this.qName = qName; 39 this.port = Convert.ToInt32(sPort); 40 this.hostname = hostname; 41 InitQueueEnv(); 42 qManager = new MQQueueManager(qManagerName); 43 } 44 45 /// <summary> 46 /// 初始化队列环境 47 /// </summary> 48 private void InitQueueEnv() 49 { 50 // 初始化MQ 环境变量,以指定MQ 服务器的连接参数; 51 // 指定MQ 服务器的主机名称; 52 MQEnvironment.Hostname = hostname; 53 // 指定MQ 服务器的服务器连接通道的名称; 54 MQEnvironment.Channel = channel; 55 // 指定MQ 服务器的侦听器的侦听端口号; 56 MQEnvironment.Port = port; 57 //MQEnvironment.UserId = "mqm"; 58 } 59 60 public void SendMessage(string message) 61 { 62 if (qManager == null) 63 { 64 throw new Exception("队列管理器未初始化。"); 65 } 66 // 获得队列的访问句柄; 67 MQQueue lq = qManager.AccessQueue(qName, openOptions); 68 69 try 70 { 71 // 构造新的消息对象,为发送消息做准备; 72 MQMessage mo = new MQMessage(); 73 //指定编码(有点小重要哦) 74 mo.CharacterSet = 1208; 75 // 填入消息内容; 76 //mo.WriteUTF(message); 77 mo.WriteString(message); 78 //指定消息的格式 79 mo.Format = MQC.MQFMT_STRING; 80 // 构造放入消息选项对象; 81 MQPutMessageOptions pmo = new MQPutMessageOptions(); 82 // 向已打开队列放入已构造的测试消息; 83 lq.Put(mo, pmo); 84 } 85 finally 86 { 87 try 88 { 89 // 关闭本地队列; 90 lq.Close(); 91 } 92 catch (Exception e) 93 { 94 Debug.WriteLine(e); 95 } 96 } 97 } 98 99 public void SendFile(string filePath) 100 { 101 if (qManager == null) 102 { 103 throw new Exception("队列管理器未初始化。"); 104 } 105 // 获得队列的访问句柄; 106 MQQueue lq = qManager.AccessQueue(qName, openOptions); 107 108 try 109 { 110 // 构造新的消息对象,为发送消息做准备; 111 MQMessage mo = new MQMessage(); 112 //构建文件信息对象 113 FileInfo fi = new FileInfo(filePath); 114 //写入文件大小 115 mo.WriteInt8(fi.Length); 116 //写入文件名 117 mo.WriteUTF(fi.Name); 118 //写入文件内容 119 mo.Write(File.ReadAllBytes(filePath)); 120 // 构造放入消息选项对象; 121 MQPutMessageOptions pmo = new MQPutMessageOptions(); 122 // 向已打开队列放入已构造的测试消息; 123 lq.Put(mo, pmo); 124 } 125 finally 126 { 127 try 128 { 129 // 关闭本地队列; 130 lq.Close(); 131 } 132 catch (Exception e) 133 { 134 Debug.WriteLine(e); 135 } 136 } 137 } 138 139 ~IbmMQClient() 140 { 141 Close(); 142 } 143 144 /// <summary> 145 /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. 146 /// </summary> 147 /// <filterpriority>2</filterpriority> 148 public void Dispose() 149 { 150 Close(); 151 } 152 153 public void Close() 154 { 155 if (qManager != null) 156 { 157 try 158 { 159 // 释放与队列管理器的连接; 160 qManager.Disconnect(); 161 } 162 catch (Exception e) 163 { 164 Debug.WriteLine(e); 165 } 166 } 167 } 168 } 169 }