基于C#的IBM消息队列操作客户端

背景:

做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 }

 

你可能感兴趣的:(消息队列)