新聞中心
今天,我們將會在這篇文章中為大家詳細介紹一下關(guān)于WCF MSMQ隊列的一些基本特性。希望對于初學(xué)者來說,可以從這里介紹的內(nèi)容中獲得一些幫助,并能夠充分掌握這些基本技巧,以方便我們的實際應(yīng)用。

站在用戶的角度思考問題,與客戶深入溝通,找到威海網(wǎng)站設(shè)計與威海網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋威海地區(qū)。
WCF MSMQ隊列中共有兩種類型,事務(wù)性隊列(transactional queue)會將消息持久(persiste)存儲到磁盤中,即便服務(wù)器當機(shutdown)、重啟(reboot)或崩潰(crash),消息依然可以在系統(tǒng)恢復(fù)后被讀取。同時,消息發(fā)布、獲取和刪除都在環(huán)境事務(wù)范圍內(nèi),從而確保消息的可靠性。我們還可以使用 TransactionScope 將環(huán)境事務(wù)傳遞給隊列,否則隊列會自動創(chuàng)建一個內(nèi)部事務(wù)。非事務(wù)性隊列(nontransactional volatile queues)只是將消息存在內(nèi)存,不會使用磁盤進行持久存儲,且不會使用事務(wù)來保護對消息的操作。一但服務(wù)器發(fā)生問題,或者調(diào)用方出現(xiàn)異常,消息都會丟失。
- // 創(chuàng)建事務(wù)性隊列
- MessageQueue.Create(@".\private$\myqueue", true);
- // 創(chuàng)建非事務(wù)性隊列
- MessageQueue.Create(@".\private$\myqueue");
通過下面的例子我們會看到事務(wù)失敗時,沒有任何消息被寫入隊列。
- [ServiceContract]
- public interface IService
- {
- [OperationContract(IsOneWay = true)]
- void Test(int i);
- }
- [ServiceBehavior]
- public class MyService : IService
- {
- [OperationBehavior]
- public void Test(int i)
- {
- Console.WriteLine(i);
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- if (!MessageQueue.Exists(@".\private$\myqueue"))
- {
- MessageQueue.Create(@".\private$\myqueue", true);
- }
- IService client = ChannelFactory
.CreateChannel( - new NetMsmqBinding(NetMsmqSecurityMode.None),
- new EndpointAddress("net.msmq://localhost/private/myqueue"));
- try
- {
- using (TransactionScope scope = new TransactionScope())
- {
- using (client as IDisposable)
- {
- for (int i = 0; i < 10; i++)
- {
- client.Test(i);
- if (i > 5) throw new Exception();
- }
- }
- scope.Complete();
- }
- }
- catch
- {
- }
- AppDomain.CreateDomain("Server").DoCallBack(delegate
- {
- ServiceHost host = new ServiceHost(typeof(MyService),
new Uri("net.msmq://localhost/private/myqueue"));- host.AddServiceEndpoint(typeof(IService),
new NetMsmqBinding(NetMsmqSecurityMode.None), "");- host.Open();
- });
- }
- }
這里需要對 "消息" 做一個澄清,當客戶端發(fā)出調(diào)用(call)時,調(diào)用會被轉(zhuǎn)換成 WCF Message,然后被包裝到 MSMQ Message 中。如果客戶端事務(wù)完成提交,那么 MSMQ Message 會被傳遞到隊列并存儲起來。相反,如果事務(wù)失敗,消息會被丟棄。上面的例子中,我們將多個調(diào)用放到一個環(huán)境事務(wù)中,也可以將多個服務(wù)調(diào)用放到一個事務(wù)當中。如果隊列服務(wù)不在當前機器上,也就是說使用 Public Queue 時,客戶端的消息隊列組件將承擔 "代理(proxy)" 的角色。客戶端的調(diào)用會首先存儲到本地隊列,然后再由本地隊列轉(zhuǎn)發(fā)給目標隊列。這個轉(zhuǎn)發(fā)過程同樣受到事務(wù)保護。
要是開發(fā)非事務(wù)性消息隊列服務(wù),需要用到 NetMsmqBinding 的兩個屬性。將 Durable 設(shè)為 false,表示不使用事務(wù)方式訪問消息隊列。另外還得將 ExactlyOnce 設(shè)為 false,否則會拋出 InvalidOperationException 異常。
下面例子中,重啟消息隊列服務(wù)(Message Queuing)后,你會發(fā)現(xiàn)消息丟失。
- [ServiceContract]
- public interface IService
- {
- [OperationContract(IsOneWay = true)]
- void Test(int i);
- }
- [ServiceBehavior]
- public class MyService : IService
- {
- public MyService()
- {
- Console.WriteLine("Constructor...");
- }
- [OperationBehavior(TransactionScopeRequired=true)]
- public void Test(int i)
- {
- Console.WriteLine(i);
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- MessageQueue.Delete(@".\private$\myqueue");
- MessageQueue.Create(@".\private$\myqueue");
- NetMsmqBinding binding1 = new NetMsmqBinding
(NetMsmqSecurityMode.None);- binding1.Durable = false;
- binding1.ExactlyOnce = false;
- IService client = ChannelFactory
.CreateChannel(binding1,- new EndpointAddress("net.msmq://localhost/private/myqueue"));
- using (client as IDisposable)
- {
- for (int i = 0; i < 10; i++)
- {
- client.Test(i);
- }
- }
- Console.WriteLine("重啟MSMQ服務(wù),然后按任意鍵繼續(xù)...");
- Console.ReadKey(true);
- AppDomain.CreateDomain("Server").DoCallBack(delegate
- {
- NetMsmqBinding binding2 = new NetMsmqBinding
(NetMsmqSecurityMode.None);- binding2.Durable = false;
- binding2.ExactlyOnce = false;
- ServiceHost host = new ServiceHost(typeof(MyService),
new Uri("net.msmq://localhost/private/myqueue"));- host.AddServiceEndpoint(typeof(IService), binding2, "");
- host.Open();
- });
- }
- }
文章標題:WCFMSMQ隊列基本概念簡述
標題URL:http://www.fisionsoft.com.cn/article/djocdpc.html


咨詢
建站咨詢
