2、事務性消息處理
事務我想你們對這個詞應該都不會陌生,在操做數據庫的時候常常都會用到事務,確保操做成功,要麼所有完成(成功)
,要麼所有不完成(失敗)。在MSMQ中利用事務性處理,能夠確保事務中的消息按照順序傳送,只傳送一次,而且從目的隊列成
功地被檢索。
那麼,在MSMQ上使用事務性處理怎麼實現呢?能夠經過建立MessageQueueTransation類的實例並將其關聯到MessageQueue
組件的實例來執行,執行事務的Begin方法,並將其實例傳遞到收發方法。而後,調用Commit以將事務的更改保存到目的隊列。
建立事務性消息和普通的消息有一點小小的區別,你們可從下圖上體會到: 數據庫
1//建立普通的專用消息隊列
2MessageQueue myMessage = MessageQueue.Create(@".\private$\myQueue");
3//建立事務性的專用消息隊列
4MessageQueue myTranMessage =MessageQueue.Create(@".\private$\myQueueTrans", true);spa
啓動了事務,那麼在發送和接收消息的時候確定是與原來有必定的差異的,這裏我就不作詳細介紹,下面給出示意性代碼,有興
趣的朋友能夠直接下載本文示例程序代碼瞭解更多。orm
普通的消息發送示意性代碼:隊列
1//鏈接到本地的隊列事務
2MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue");消息隊列
3Message myMessage = new Message();string
4myMessage.Body = "消息內容";it
5myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });io
6//發送消息到隊列中下載
7myQueue.Send(myMessage);
啓動了事務後的消息發送示意性代碼:
1//鏈接到本地的隊列
2MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
4Message myMessage = new Message();
5myMessage.Body = "消息內容";
6myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
8MessageQueueTransaction myTransaction = new MessageQueueTransaction();
9//啓動事務
10myTransaction.Begin();
11//發送消息到隊列中
12myQueue.Send(myMessage, myTransaction); //加了事務
13//提交事務
14myTransaction.Commit();
15Console.WriteLine("消息發送成功!");
讀取消息示意性代碼:
1//鏈接到本地隊列
2MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
3myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
4if (myQueue.Transactional)
5{
MessageQueueTransaction myTransaction = new MessageQueueTransaction();
//啓動事務
myTransaction.Begin();
//從隊列中接收消息
Message myMessage = myQueue.Receive(myTransaction);
string context = myMessage.Body as string; //獲取消息的內容
myTransaction.Commit();
Console.WriteLine("消息內容爲:" + context);
14}