上篇博文中我們介紹了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)證:
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 }
發(fā)送消息完成,但是未提交事務(wù)前,隊(duì)列是這樣的:
事務(wù)提交后Complete:
然后,我們繼續(xù)研究驗(yàn)證同一個(gè)隊(duì)列接收消息的事務(wù)性:有個(gè)前提要求:
消息接收時(shí),如果啟動(dòng)事務(wù),消息消費(fèi)接收模式必須是PeekAndLock模式。
消息接收完成,如果事務(wù)不Complete,消息仍舊在消息隊(duì)列中。
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 }
當(dāng)接收完消息,事務(wù)未提交時(shí):
隊(duì)列中的消息是:
事務(wù)提交后:
Azure Service Bus 中消息:
消息已經(jīng)被消費(fèi)。
以上就是Azure ServiceBus 中對(duì)消息事務(wù)的支持。
http://www.cnblogs.com/tianqing/p/6648887.html