快速业务通道

在ASP.NET中进行消息处理(MSMQ) 二

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
[index].Label; 20          string body = messages[index].Body.ToString(); 21          string priority = messages[index].Priority.ToString(); 22 23          messageTable.Rows.Add(new string[] { label, body, priority }); 24        } 25        this.dgvMessage.DataSource = messageTable; 26      } 27      catch (MessageQueueException e1) 28      { 29        MessageBox.Show(e1.Message); 30      } 31    } 32  }

这里封装了一方法,专门负责从队列里读取全部消息并绑定在DataGridView控件上,这里我们只需要在按扭Click事件里调用这方法就OK。

1private void btnRec_Click(object sender, EventArgs e)
2{
3  DisplayMessage();
4}

这就完成了给消息设置优先级的消息传输的应用,最终的测试结果如下:

在ASP.NET中进行消息处理(MSMQ) 二

注:要完成以上应用还需注意一点,由于消息的优先级是枚举类型,在直接messages[index].Priority.ToString();这种方式来获取优先级转化到字符串的时候,他需要一个过滤器(Filter),否则会抛出一个InvalidCastExceptionle类型的异常,异常信息"接收消息时未检索到属性 Priority。请确保正确设置了 PropertyFilter。",要解决这问题只需要把消息对象的MessageReadPropertyFilter(过滤器) 的Priority设置为true就OK了。见上面代码里!^.^

MessagePriority枚举源代码定义详细如下:

1// 摘要:
2//   指定消息队列在消息传递到队列的过程中应用于该消息的优先级,以及指定何时将消息插入目标队列。
3public enum MessagePriority
4{
5  // 摘要:
6  //   最低消息优先级。
7  Lowest = 0,
8  //
9  // 摘要:
10  //   位于 Low 和 Lowest 消息优先级之间。
11  VeryLow = 1,
12  //
13  // 摘要:
14  //   低消息优先级。
15  Low = 2,
16  //
17  // 摘要:
18  //   普通消息优先级。
19  Normal = 3,
20  //
21  // 摘要:
22  //   位于 System.Messaging.MessagePriority.High 和 System.Messaging.MessagePriority.Normal
23  //   消息优先级之间。
24  AboveNormal = 4,
25  //
26  // 摘要:
27  //   高消息优先级。
28  High = 5,
29  //
30  // 摘要:
31  //   位于 Highest 和 High 消息优先级之间。
32  VeryHigh = 6,
33  //
34  // 摘要:
35  //   最高消息优先级。
36  Highest = 7,
37}

二、事务性消息处理

事务我想大家对这个词应该都不会陌生,在操作数据库的时候经常都会用到事务,确保操作成功,要么全部完成(成功),要么全部不完成(失败)。在MSMQ中利用事务性处理,可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。

那么,在MSMQ上使用事务性处理怎么实现呢?可以通过创建MessageQueueTransation类的实例并将其关联到MessageQueue组件的实例来执行,执行事务的Begin方法,并将其实例传递到收发方法。然后,调用Commit以将事务的更改保存到目的队列。

创建事务性消息和普通的消息有一点小小的区别,大家可从下图上体会到:

在ASP.NET中进行消息处理(MSMQ) 二

通过代码方式建立事务性消息队列只在Create方法的参数上动动手脚就OK,详细如下:

1//创建普通的专用消息队列
2MessageQueue myMessage = MessageQueue.Create(@".\private$\myQueue");
3//创建事务性的专用消息队列
4MessageQueue myTranMessage =MessageQueue.Create(@".\private$\myQueueTrans", true);

启动了事务,那么在发送和接收消息的时候肯定是与原来有一定的差别的,这里我就不做详细介绍,下

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号