.Net下的MSMQ的同步异步调用
来源:互联网 发布:域名备案 网站备案 编辑:程序博客网 时间:2024/05/29 15:41
一、MSMQ简介
MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。消息队列
和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息,消息类型中都指出发送者和接收者的地址;然而他们的用处却有着很大的
区别:消息队列的发送者和接收者是应用程序,而电子邮件的发送者和接收者通常是人。如同电子邮件一样,消息队列的发送和接收也不需要
发送者和接收者同时在场,可以存储在消息队列或是邮件服务器中。
二、消息队列的安装
默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应
用程序服务器,双击它进入详细资料中选择消息队列一项进行安装,如图:
公共队列
专用队列
Mq.Receive(TimeSpantimeout);//设定超时时间
Mq.ReceiveById(ID);
Mq.Peek();
通过Receive方法接收消息同时永久性地从队列中删除消息;
利用委托机制:MessQueue.ReceiveCompleted+=newReceiveCompletedEventHandler(mq_ReceiveCompleted);
(3)消息阅读
而在接受端必须反序列化,利用下面的代码可以实现:
{
System.Messaging.Messagem=MessQueue.EndReceive(e.AsyncResult);
m.Formatter=newSystem.Messaging.XmlMessageFormatter(newstring[]{"System.String,mscorlib"});
Console.WriteLine("Message:"+(string)m.Body);
MessQueue.BeginReceive();
1usingSystem;
2usingSystem.Messaging;
3usingSystem.Threading;
5
6namespaceLoveStatusService
7{
8 /**////<summary>
9 ///SummarydescriptionforMSMQ.
10 ///</summary>
11 publicclassMSMQ
12 {
13 publicMSMQ()
14 {
15 //
16 //TODO:Addconstructorlogichere
17 //
18 }
19
20
21 privateMessageQueue_messageQueue=null;
22 //最大并发线程数
23 privatestaticintMAX_WORKER_THREADS=Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["MAX_WORKER_THREADS"].ToString());
24 //MSMQ路径
25 privatestaticstringMSMQPath=System.Configuration.ConfigurationSettings.AppSettings["LoveStatusMQPath"];
26 //等待句柄
27 privateWaitHandle[]waitHandleArray=newWaitHandle[MAX_WORKER_THREADS];
28 //任务类型
29 //1.SendEmail2.SendMessage 3.SendEmailandMessage
30 privatestringTaskType=System.Configuration.ConfigurationSettings.AppSettings["TaskType"];
31 publicMessageQueueMessQueue
32 {
33 get
34 {
35
36 if(_messageQueue==null)
37 {
38 if(MessageQueue.Exists(MSMQPath))
39 {
40 _messageQueue=newMessageQueue(MSMQPath);
41 }
42 else
43 {
44 _messageQueue=MessageQueue.Create(MSMQPath);
45 }
46 }
47
48
49 return_messageQueue;
50 }
51 }
52
53
54 PrivateMethod#regionPrivateMethod
55
56 privatevoidmq_ReceiveCompleted(objectsender,System.Messaging.ReceiveCompletedEventArgse)
57 {
58 MessageQueuemqq=(MessageQueue)sender;
59 System.Messaging.Messagem=mqq.EndReceive(e.AsyncResult);
60 //m.Formatter=newSystem.Messaging.XmlMessageFormatter(newstring[]{"System.String,mscorlib"});
61 m.Formatter=newSystem.Messaging.XmlMessageFormatter(newType[]{typeof(UserObject)});
62 //log.Info("ReceiveUserID:"+(string)m.Body);
63 UserObjectobj=(UserObject)m.Body;
64 longcurUserId=obj.curUserID;
65 longoppUserId=obj.oppUserID;
66 stringcurUserName=obj.curUserName;
67 stringoppUserName=obj.oppUserName;
68 stringcurEmail=obj.curEmail;
69 stringoppEmail=obj.oppEmail;
70 stringsubject=obj.subject;
71 stringbody=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("==Sendto=="+oppEmail);
81 break;
82 //Message
83 case"2":
84 MessageForMQ.SendMessage(curUserId,oppUserId,subject,body);
85 AppLog.log.Info("==SendMsgto=="+oppUserId);
86 break;
87 //EmailandMessage
88 case"3":
89 EmailForMQ.SendEmailForLoveStatus(curEmail,oppEmail,curUserName,oppUserName,subject);
90 AppLog.log.Info("==Sendto=="+oppEmail);
91 MessageForMQ.SendMessage(curUserId,oppUserId,subject,body);
92 AppLog.log.Info("==SendMsgto=="+oppUserId);
93 break;
94 default:
95 break;
96
97 }
98 mqq.BeginReceive();
99
100 }
101
102 #endregion
103
104 PublicMethod#regionPublicMethod
105
106 //一个将对象发送到队列的方法,这里发送的是对象
107 publicvoidSendUserIDToMQ(objectarr)
108 {
109 MessQueue.Send(arr);
110 Console.WriteLine("Ok");
111 Console.Read();
112 }
113
114 //同步接受队列内容的方法
115 publicvoidReceiveFromMQ()
116 {
117 Messagems=newMessage();
118
119 //ms=MessQueue.Peek();
120 try
121 {
122 ms=MessQueue.Receive(newTimeSpan(0,0,5));
123 if(ms!=null)
124 {
125 ms.Formatter=newXmlMessageFormatter(newType[]{typeof(string)});
126 AppLog.log.Info((string)ms.Body) ;
127 }
128 }
129 catch(Exceptionex)
130 {
131
132 }
133
134
135 }
136
137 //开始监听工作线程
138 public voidstartListen()
139 {
140 AppLog.log.Info("--Thread--"+MAX_WORKER_THREADS);
141 MessQueue.ReceiveCompleted+=newReceiveCompletedEventHandler(mq_ReceiveCompleted);
142
143 //异步方式,并发
144
145 for(inti=0;i<MAX_WORKER_THREADS;i++)
146 {
147 //Beginasynchronousoperations.
148 waitHandleArray[i]=MessQueue.BeginReceive().AsyncWaitHandle;
149 }
150
151 AppLog.log.Info("------StartListen--------");
152
153 return;
154
155 }
156
157
158 //停止监听工作线程
159 publicvoidstopListen()
160 {
161
162 for(inti=0;i<waitHandleArray.Length;i++)
163 {
164
165 try
166 {
167 waitHandleArray[i].Close();
168 }
169 catch
170 {
171 AppLog.log.Info("---waitHandleArray[i].Close()Error!-----");共4页: 上一页 1 [2] [3] [4] 下一页 <script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- .Net下的MSMQ的同步异步调用
- .Net下的MSMQ的同步异步调用
- .Net下的MSMQ的同步异步调用
- .net的MSMQ异步调用
- .net的MSMQ异步调用
- .net的MSMQ异步调用
- .net的MSMQ异步调用
- .Net下的MSMQ(微软消息队列)的同步异步调用 (转载)
- .Net下的MSMQ(微软消息队列)的同步异步调用
- BAPI的同步异步调用
- 委托的异步调用和同步调用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- 深入了解php4(2)--重访过去
- 组合.NET数据控件构建强大用户接口
- php4的session功能评述(三)
- ASP.NET2.0实现防止同一用户同时登陆
- 使用str-replace而不是ereg-replace
- .Net下的MSMQ的同步异步调用
- 程序与生活
- php4的session功能评述(二)
- 从XML文件中读取数据绑定到DropDownList
- PHP 高手之路(二)
- ASP.NET2.0里输出文本格式流
- PHP 高手之路(三)
- C#定时器的使用
- PHP 高手之路(一)