一、MSMQ简介
MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。消息队列
和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息,消息类型中都指出发送者和接收者的地址;然而他们的用处却有着很大的
区别:消息队列的发送者和接收者是应用程序,而电子邮件的发送者和接收者通常是人。如同电子邮件一样,消息队列的发送和接收也不需要
发送者和接收者同时在场,可以存储在消息队列或是邮件服务器中。
二、消息队列的安装
默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应
用程序服务器,双击它进入详细资料中选择消息队列一项进行安装,如图:
![](https://images.cnblogs.com/cnblogs_com/goody9807/mq1.JPG)
![](https://images.cnblogs.com/cnblogs_com/goody9807/mq2.JPG)
![](https://images.cnblogs.com/cnblogs_com/goody9807/mq3.JPG)
三、消息队列类型
消息对列分为3类:
公共队列
MachineName\QueueName
能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
专用队列
MachineName\Private$\QueueName
只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。
日志队列
MachineName\QueueName\Journal$
四、消息队列的创建
MessageQueue Mq=new MessageQueue(“.\\private$\\Mymq”);
通过Path属性引用消息队列的代码也十分简单:
MessageQueue Mq=new MessageQueue();
Mq.Path=”.\\private$\\Mymq”;
使用 Create 方法可以在计算机上创建队列:
System.Messaging.MessageQueue.Create(@".\private$\Mymq");
这里注意由于在C#中要记住用反斜杠将“\”转义。
由于消息对列所放置的地方经常改变,所以建议消息队列路径不要写死,建议放在配置文件中。
五、消息的发送
消息的发送可以分为简单消息和复杂消息,简单消息类型就是常用的数据类型,例如整型、字符串等数据;复杂消息的数据类型通常对应于系
统中的复杂数据类型,例如结构,对象等等。
Mq.Send("Hello!");
在这里建议你可以事先定义一个对象类,然后发送这个对象类的实例对象,这样以后无论在增加什么发送信息,只需在对象类中增加
相应的属性即可。
六、消息的接收和阅读
(1)同步接收消息
接收消息的代码很简单:
Mq.Receive();
Mq.Receive(TimeSpan timeout); //设定超时时间
Mq.ReceiveById(ID);
Mq.Peek();
通过Receive方法接收消息同时永久性地从队列中删除消息;
通过Peek方法从队列中取出消息而不从队列中移除该消息。
如果知道消息的标识符(ID),还可以通过ReceiveById方法和PeekById方法完成相应的操作。
(2)异步接受消息
利用委托机制:
MessQueue.ReceiveCompleted +=new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
(3)消息阅读
在应用程序能够阅读的消息和消息队列中的消息格式不同,应用程序发送出去的消息经过序列化以后才发送给了消息队列
而在接受端必须反序列化,利用下面的代码可以实现:
public void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
{
System.Messaging.Message m = MessQueue.EndReceive(e.AsyncResult);
m.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"System.String,mscorlib"});
Console.WriteLine("Message: " + (string)m.Body);
MessQueue.BeginReceive() ;
}
反序列化还有另一种写法:
m.Formatter = new XmlMessageFormatter ( new Type [] { typeof (string) } );
七、由于消息队列的代码有些是固定不便的,所以把这些代码封装成一个类方便以后使用:
1
using System;
2
using System.Messaging;
3
using System.Threading;
5
6
namespace LoveStatusService
7
{
8
/// <summary>
9
/// Summary description for Msmq.
10
/// </summary>
11
public class Msmq
12
{
13
public Msmq()
14
{
15
//
16
// TODO: Add constructor logic here
17
//
18
}
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
21
private MessageQueue _messageQueue=null;
22
//最大并发线程数
23
private static int MAX_WORKER_THREADS=Convert.ToInt32( System.Configuration.ConfigurationSettings.AppSettings["MAX_WORKER_THREADS"].ToString());
24
//Msmq路径
25
private static string MsmqPath=System.Configuration.ConfigurationSettings.AppSettings["LoveStatusMQPath"];
26
//等待句柄
27
private WaitHandle[] waitHandleArray = new WaitHandle[MAX_WORKER_THREADS];
28
//任务类型
29
//1. Send Email 2. Send Message 3. Send Email and Message
30
private string TaskType=System.Configuration.ConfigurationSettings.AppSettings["TaskType"];
31
public MessageQueue MessQueue
32
{
33
get
34
{
35
36
if (_messageQueue==null)
37
{
38
if(MessageQueue.Exists(MsmqPath))
39
{
40
_messageQueue = new MessageQueue(MsmqPath);
41
}
42
else
43
{
44
_messageQueue = MessageQueue.Create(MsmqPath);
45
}
46
}
47
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
return _messageQueue;
50
}
51
}
52
53![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
#region Private Method
55![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
57
{
58
MessageQueue mqq = (MessageQueue)sender;
59
System.Messaging.Message m = mqq.EndReceive(e.AsyncResult);
60
//m.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"System.String,mscorlib"});
61
m.Formatter =new System.Messaging.XmlMessageFormatter(new Type[] {typeof(UserObject)}) ;
62
//log.Info("Receive UserID: " + (string)m.Body) ;
63
UserObject obj=(UserObject)m.Body ;
64
long curUserId=obj.curUserID ;
65
long oppUserId=obj.oppUserID;
66
string curUserName=obj.curUserName;
67
string oppUserName=obj.oppUserName;
68
string curEmail=obj.curEmail ;
69
string oppEmail=obj.oppEmail;
70
string subject =obj.subject ;
71
string body=obj.body ;
72
//AppLog.log.Info("curUserId:"+curUserId) ;
73
//AppLog.log.Info("oppUserId:"+oppUserId) ;
74
AppLog.log.Info("==type="+TaskType) ;
75
switch(TaskType)
76
{
77
//Email
78
case "1":
79
EmailForMQ.SendEmailForLoveStatus(curEmail,oppEmail,curUserName,oppUserName,subject) ;
80
AppLog.log.Info("==Send to=="+oppEmail) ;
81
break;
82
//Message
83
case "2":
84
MessageForMQ.SendMessage(curUserId,oppUserId,subject,body) ;
85
AppLog.log.Info("==Send Msg to=="+oppUserId) ;
86
break;
87
//Email and Message
88
case "3":
89
EmailForMQ.SendEmailForLoveStatus(curEmail,oppEmail,curUserName,oppUserName,subject) ;
90
AppLog.log.Info("==Send to=="+oppEmail) ;
91
MessageForMQ.SendMessage(curUserId,oppUserId,subject,body) ;
92
AppLog.log.Info("==Send Msg to=="+oppUserId) ;
93
break;
94
default:
95
break;
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
}
98
mqq.BeginReceive() ;
99![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
100
}
101![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
102
#endregion
103![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
104
#region Public Method
105![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
106
//一个将对象发送到队列的方法,这里发送的是对象
107
public void SendUserIDToMQ(object arr)
108
{
109
MessQueue.Send(arr) ;
110
Console.WriteLine("Ok") ;
111
Console.Read() ;
112
}
113![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
114
//同步接受队列内容的方法
115
public void ReceiveFromMQ()
116
{
117
Message ms=new Message() ;
118
119
//ms=MessQueue.Peek();
120
try
121
{
122
ms=MessQueue.Receive(new TimeSpan(0,0,5));
123
if(ms!=null)
124
{
125
ms.Formatter = new XmlMessageFormatter ( new Type [] { typeof (string) } );
126
AppLog.log.Info((string)ms.Body) ;
127
}
128
}
129
catch(Exception ex)
130
{
131
132
}
133
134
135
}
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
//开始监听工作线程
138
public void startListen()
139
{
140
AppLog.log.Info("--Thread--"+MAX_WORKER_THREADS) ;
141
MessQueue.ReceiveCompleted +=new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
142
143
//异步方式,并发
144
145
for(int i=0; i<MAX_WORKER_THREADS; i++)
146
{
147
// Begin asynchronous operations.
148
waitHandleArray[i] = MessQueue.BeginReceive().AsyncWaitHandle;
149
}
150![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
151
AppLog.log.Info("------Start Listen--------") ;
152![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153
return;
154![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
155
}
156![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157
158
//停止监听工作线程
159
public void stopListen()
160
{
161![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
162
for(int i=0;i<waitHandleArray.Length;i++)
163
{
164![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
165
try
166
{
167
waitHandleArray[i].Close();
168
}
169
catch
170
{
171
AppLog.log.Info("---waitHandleArray[i].Close() Error!-----") ;
172
}
173![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
174
}
175![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
176
try
177
{
178
// Specify to wait for all operations to return.
179
WaitHandle.WaitAll(waitHandleArray,1000,false);
180
}
181
catch
182
{
183
AppLog.log.Info("---WaitHandle.WaitAll Error!-----") ;
184
}
185
AppLog.log.Info("------Stop Listen--------") ;
186![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
187
}
188![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
189
#endregion
190
191
192![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
193
194
}
195
}196![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
UserObject的代码
另一个同事写的封装类
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
using System;
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
using System.Threading;
4![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
using System.Messaging;
6![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
namespace Wapdm.SmsApp
10![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
{
12![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
/// <summary>
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
/// <para>
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
/// A Logger implementation that writes messages to a message queue.
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
/// The default event formatter used is an instance of XMLEventFormatter
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
/// </para>
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
/// </summary>
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
public sealed class MsgQueue
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
{
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
30![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
private const string BLANK_STRING = "";
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
private const string PERIOD = @".\private$"; //".";
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
private const string ELLIPSIS = "
";
36![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
private string serverAddress;
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
private string queueName;
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
private string queuePath;
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
private bool IsContextEnabled;
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
50![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
private MessageQueue queue;
52![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
54![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
private object queueMonitor = new object();
56![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
58![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
private MsgQueue() {}
60![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
public static MsgQueue mq = null;
64![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
public static WaitHandle[] waitHandleArray = new WaitHandle[Util.MAX_WORKER_THREADS];
66![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
67
68![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
69
public MsgQueue(string _serverAddress, string _queueName, string _summaryPattern)
70![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
{
72![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
73
if ((_serverAddress == null) || (_queueName == null) || (_summaryPattern == null))
74![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
{
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
throw new ArgumentNullException();
78![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
}
80![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
81
ServerAddress = _serverAddress;
82![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
83
QueueName = _queueName;
84![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
85
IsContextEnabled = true;
86![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
}
88![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
90![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
public MsgQueue(string _serverAddress, string _queueName)
92![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
93
{
94![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
95
if ((_serverAddress == null) || (_queueName == null))
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
{
98![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99
throw new ArgumentNullException();
100![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
}
102![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
ServerAddress = _serverAddress;
104![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
QueueName = _queueName;
106![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
107
IsContextEnabled = true;
108![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109
}
110![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111
112![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
113
public MsgQueue(string _queueName)
114![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
115
{
116![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117
if (_queueName == null)
118![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
119
{
120![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
121
throw new ArgumentNullException();
122![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123
}
124![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
125
serverAddress = PERIOD;
126![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
127
QueueName = _queueName;
128![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
129
IsContextEnabled = true;
130![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
if ( IsContextEnabled == false )
132![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
133
throw new ArgumentNullException();
134![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135
}
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
138![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
139
public string ServerAddress
140![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
141
{
142![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
143
get
144![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
145
{
146![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
147
return serverAddress;
148![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
149
}
150![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
151
set
152![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153
{
154![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
155
if (value == null)
156![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157
{
158![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
159
value = PERIOD;
160![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
161
}
162![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
163
value = value.Trim();
164![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
165
if (value.Equals(BLANK_STRING))
166![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
167
{
168![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
169
throw new ArgumentException("Invalid value (must contain non-whitespace characters)");
170![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
171
}
172![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
173
lock (queueMonitor)
174![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
175
{
176![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
177
serverAddress = value;
178![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
179
queuePath = serverAddress + '\\' + queueName;
180![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
181
InitializeQueue();
182![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
183
}
184![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
185
}
186![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
187
}
188![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
189
190![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
191
public string QueueName
192![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
193
{
194![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
195
get
196![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
197
{
198![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
199
return queueName;
200![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
201
}
202![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
203
set
204![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
205
{
206![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
207
if (value == null)
208![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
209
{
210![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
211
throw new ArgumentNullException();
212![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
213
}
214![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
215
value = value.Trim();
216![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
217
if (value.Equals(BLANK_STRING))
218![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
219
{
220![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
221
throw new ArgumentException("Invalid value (must contain non-whitespace characters)");
222![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
223
}
224![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
225
lock (queueMonitor)
226![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
227
{
228![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
229
queueName = value;
230![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
231
queuePath = serverAddress + '\\' + queueName;
232![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
233
InitializeQueue();
234![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
235
}
236![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
237
}
238![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
239
}
240![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
241
242![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
243
private void InitializeQueue()
244![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
245
{
246![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
247
lock (queueMonitor)
248![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
249
{
250![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
251
if (queue != null)
252![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
253
{
254![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
255
try { queue.Close(); }
256![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
257
catch {}
258![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
259
queue = null;
260![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
261
}
262![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
263
264![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
265
try
266![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
267
{
268![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
269
if(!MessageQueue.Exists(queuePath))
270![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
271
MessageQueue.Create(queuePath);
272![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
273
}
274![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
275
catch {}
276![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
277
try
278![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
279
{
280![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
281
queue = new MessageQueue(queuePath);
282![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
283
queue.SetPermissions("EveryOne",MessageQueueAccessRights.FullControl);
284![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
285
queue.Formatter = new XmlMessageFormatter(new Type[] {typeof(MoMsg)});
286![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
287
}
288![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
289
catch (Exception e)
290![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
291
{
292![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
293
try { queue.Close(); }
294![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
295
catch {}
296![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
297
queue = null;
298![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
299
throw new ApplicationException("Couldn't open queue at '" + queuePath + "': " + e.GetType().FullName + ": " + e.Message);
300![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
301
}
302![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
303
304![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
305
}
306![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
307
}
308![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
309
310![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
311
private void AcquireResources()
312![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
313
{
314![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
315
InitializeQueue();
316![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
317
}
318![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
319
320![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
321
public void ReleaseResources()
322![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
323
{
324![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
325
lock (queueMonitor)
326![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
327
{
328![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
329
if (queue != null)
330![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
331
{
332![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
333
try
334![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
335
{
336![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
337
queue.Close();
338![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
339
}
340![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
341
catch {}
342![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
343
queue = null;
344![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
345
}
346![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
347
}
348![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
349
}
350![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
351
352![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
353
//阻塞方式
354![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
355
public MoMsg Read( )
356![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
357
{
358![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
359
MoMsg _event = null;
360![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
361
lock (queueMonitor)
362![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
363
{
364![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
365
if (queue == null)
366![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
367
{
368![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
369
InitializeQueue();
370![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
371
}
372![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
373
try
374![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
375
{
376![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
377
Message message = queue.Receive( new TimeSpan(0,0,1) );//等待10秒
378![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
379
_event = (MoMsg) (message.Body);
380![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
381
return _event;
382![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
383
}
384![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
385
catch (Exception )
386![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
387
{
388![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
389
try { queue.Close(); }
390![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
391
catch {}
392![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
393
queue = null;
394![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
395
}
396![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
397
}
398![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
399
return null;
400![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
401
}
402![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
403
404![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
405
public void Write(MoMsg _event)
406![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
407
{
408![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
409
if (_event == null)
410![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
411
{
412![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
413
return;
414![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
415
}
416![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
417
lock (queueMonitor)
418![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
419
{
420![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
421
try
422![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
423
{
424![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
425
if (queue == null)
426![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
427
{
428![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
429
InitializeQueue();
430![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
431
}
432![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
433
434![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
435
Message message = new Message();
436![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
437
message.Priority = _event.Priority;
438![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
439
message.Recoverable = true;
440![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
441
message.Body = _event; //eventFormatter.Format(_event);
442![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
443
444![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
445
queue.Send(message);
446![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
447
}
448![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
449
catch (Exception e)
450![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
451
{
452![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
453
try { queue.Close(); }
454![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
455
catch {}
456![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
457
queue = null;
458![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
459
Util.Log.log("Couldn't write Message (" + e.GetType().FullName + ": " + e.Message + ")");
460![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
461
}
462![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
463
}
464![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
465
}
466![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
467
468![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
469
public static bool statusTest()
470![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
471
{
472![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
473
bool reValue = false;
474![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
475
try
476![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
477
{
478![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
479
MessageEnumerator re = mq.queue.GetMessageEnumerator();
480![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
481
bool rev = re.MoveNext();
482![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
483
reValue = true;
484![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
485
}
486![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
487
catch
488![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
489
{
490![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
491
reValue = false;
492![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
493
}
494![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
495
496![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
497
return reValue;
498![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
499
}
500![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
501
502![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
503
public static void startListen()
504![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
505
{
506![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
507
mq = new MsgQueue(Util.MqName);
508![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
509
510![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
511
mq.queue.ReceiveCompleted +=new ReceiveCompletedEventHandler(queue_ReceiveCompleted);
512![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
513
514![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
515
//异步方式,并发
516![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
517
for(int i=0; i<Util.MAX_WORKER_THREADS; i++)
518![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
519
{
520![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
521
// Begin asynchronous operations.
522![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
523
waitHandleArray[i] =
524![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
525
mq.queue.BeginReceive().AsyncWaitHandle;
526![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
527
}
528![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
529
530![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
531
return;
532![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
533
}
534![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
535
536![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
537
public static void stopListen()
538![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
539
{
540![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
541
542![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
543
for(int i=0;i<waitHandleArray.Length;i++)
544![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
545
{
546![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
547
try
548![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
549
{
550![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
551
waitHandleArray[i].Close();
552![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
553
}
554![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
555
catch
556![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
557
{
558![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
559
//忽略错误
560![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
561
}
562![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
563
}
564![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
565
566![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
567
try
568![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
569
{
570![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
571
// Specify to wait for all operations to return.
572![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
573
WaitHandle.WaitAll(waitHandleArray,1000,false);
574![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
575
}
576![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
577
catch
578![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
579
{
580![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
581
//忽略错误
582![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
583
}
584![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
585
}
586![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
587
588![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
589
private static void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
590![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
591
{
592![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
593
// Connect to the queue.
594![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
595
MessageQueue mqq = (MessageQueue)sender;
596![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
597
598![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
599
// End the asynchronous Receive operation.
600![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
601
Message m = mqq.EndReceive(e.AsyncResult);
602![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
603
604![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
605
Util.ProcessMo((MoMsg)(m.Body));
606![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
607
608![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
609
if(Util.isRunning)
610![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
611
{
612![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
613
// Restart the asynchronous Receive operation.
614![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
615
mqq.BeginReceive();
616![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
617
}
618![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
619
620![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
621
return;
622![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
623
}
624![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
625
}
626![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
627
}
628![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
629
来源:http://www.cnblogs.com/goody9807/archive/2007/05/18/546572.html