上篇博文中我們介紹了Azure Messaging-ServiceBus Messaging消息回執(zhí)機(jī)制。

Azure Messaging-ServiceBus Messaging消息回執(zhí)機(jī)制

本文中我們主要研究消息的事務(wù)。直奔主題:

  • Service Bus Queues支持事務(wù),基于TransactionScope

  • Service Bus Queues provide support for local transactions in the context of a single queue.

  • 事務(wù)的限制:事務(wù)只能包含一個(gè)Queue或者Topic,訂閱不能放在事務(wù)中,同時(shí)事務(wù)不支持其他系統(tǒng),例如數(shù)據(jù)庫(kù)

那消息事務(wù)的實(shí)際應(yīng)用場(chǎng)景有哪些呢?例如:

1.啟動(dòng)一個(gè)事務(wù)性的會(huì)話,將發(fā)送更新訂單狀態(tài)消息和更新賬戶余額消息放到一個(gè)事務(wù)中,消息發(fā)送失敗后 rollback,確認(rèn)消息未被發(fā)送。
2.發(fā)送更新訂單狀態(tài)消息和更新賬戶余額消息成功后,啟動(dòng)一個(gè)事務(wù)性的會(huì)話,接收并處理這兩條消息。

那我們先從同一個(gè)隊(duì)列中發(fā)送多條消息這個(gè)場(chǎng)景驗(yàn)證:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1   public static void SendMessageTransactional() 2         { 3             var sbUtils = new ServiceBusUtils(); 4  5             //創(chuàng)建隊(duì)列 6             sbUtils.CreateQueue(queueName, false); 7  8             //多次發(fā)送消息到OrderQueue 9             var queueSendClient = sbUtils.GetQueueClient(queueName);10 11             using (var trans = new TransactionScope())12             {13                 var order1 = CreateSalesOrder(1);14                 var order2 = CreateSalesOrder(2);15                 var message1 = sbUtils.Create(order1);16                 var message2 = sbUtils.Create(order2);17                 queueSendClient.Send(message1);18                 queueSendClient.Send(message2);19                 Console.WriteLine("Send but uncomplete!");20                 trans.Complete();21 22                 Console.WriteLine("Complete!");23             }            
24         }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

發(fā)送消息完成,但是未提交事務(wù)前,隊(duì)列是這樣的:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

事務(wù)提交后Complete:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

然后,我們繼續(xù)研究驗(yàn)證同一個(gè)隊(duì)列接收消息的事務(wù)性:有個(gè)前提要求:

消息接收時(shí),如果啟動(dòng)事務(wù),消息消費(fèi)接收模式必須是PeekAndLock模式。

消息接收完成,如果事務(wù)不Complete,消息仍舊在消息隊(duì)列中。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 public static void ReceiveMessageTransactional() 2         { 3             var sbUtils = new ServiceBusUtils(); 4             var queueReveiveClient = sbUtils.GetReceiveQueueClient(queueName, ReceiveMode.PeekLock); 5             using (var trans = new TransactionScope()) 6             { 7                 var message1 = queueReveiveClient.Receive(); 8                 message1.Complete(); 9                 var message2 = queueReveiveClient.Receive();10                 message2.Complete();11                 Console.WriteLine("Received but uncomplete!");12                 trans.Complete();13 14                 Console.WriteLine("Complete!");15             }16         }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

當(dāng)接收完消息,事務(wù)未提交時(shí):

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

隊(duì)列中的消息是:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

事務(wù)提交后:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

Azure Service Bus 中消息:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

消息已經(jīng)被消費(fèi)。

以上就是Azure ServiceBus 中對(duì)消息事務(wù)的支持。

http://www.cnblogs.com/tianqing/p/6648887.html