|
背景:
做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 }
|
|
|