MSMQ 事務性消息處理

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}

相關文章
相關標籤/搜索