偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

WCF MSMQ隊(duì)列基本概念簡(jiǎn)述

開發(fā) 開發(fā)工具
WCF MSMQ隊(duì)列的類型可以被分為兩種,一種為事務(wù)性隊(duì)列,而另外一種則為非事務(wù)性隊(duì)列。接下來我們將會(huì)針對(duì)這方面知識(shí)做一個(gè)詳細(xì)介紹。

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

WCF MSMQ隊(duì)列中共有兩種類型,事務(wù)性隊(duì)列(transactional queue)會(huì)將消息持久(persiste)存儲(chǔ)到磁盤中,即便服務(wù)器當(dāng)機(jī)(shutdown)、重啟(reboot)或崩潰(crash),消息依然可以在系統(tǒng)恢復(fù)后被讀取。同時(shí),消息發(fā)布、獲取和刪除都在環(huán)境事務(wù)范圍內(nèi),從而確保消息的可靠性。我們還可以使用 TransactionScope 將環(huán)境事務(wù)傳遞給隊(duì)列,否則隊(duì)列會(huì)自動(dòng)創(chuàng)建一個(gè)內(nèi)部事務(wù)。非事務(wù)性隊(duì)列(nontransactional volatile queues)只是將消息存在內(nèi)存,不會(huì)使用磁盤進(jìn)行持久存儲(chǔ),且不會(huì)使用事務(wù)來保護(hù)對(duì)消息的操作。一但服務(wù)器發(fā)生問題,或者調(diào)用方出現(xiàn)異常,消息都會(huì)丟失。

  1. // 創(chuàng)建事務(wù)性隊(duì)列  
  2. MessageQueue.Create(@".\private$\myqueue", true);  
  3. // 創(chuàng)建非事務(wù)性隊(duì)列  
  4. MessageQueue.Create(@".\private$\myqueue"); 

通過下面的例子我們會(huì)看到事務(wù)失敗時(shí),沒有任何消息被寫入隊(duì)列。

  1. [ServiceContract]  
  2. public interface IService  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void Test(int i);  
  6. }  
  7. [ServiceBehavior]  
  8. public class MyService : IService  
  9. {  
  10. [OperationBehavior]  
  11. public void Test(int i)  
  12. {  
  13. Console.WriteLine(i);  
  14. }  
  15. }  
  16. public class WcfTest  
  17. {  
  18. public static void Test()  
  19. {  
  20. if (!MessageQueue.Exists(@".\private$\myqueue"))  
  21. {  
  22. MessageQueue.Create(@".\private$\myqueue", true);  
  23. }  
  24. IService client = ChannelFactory<IService>.CreateChannel(  
  25. new NetMsmqBinding(NetMsmqSecurityMode.None),  
  26. new EndpointAddress("net.msmq://localhost/private/myqueue"));  
  27. try  
  28. {  
  29. using (TransactionScope scope = new TransactionScope())  
  30. {  
  31. using (client as IDisposable)  
  32. {  
  33. for (int i = 0; i < 10; i++)  
  34. {  
  35. client.Test(i);  
  36. if (i > 5) throw new Exception();  
  37. }  
  38. }  
  39. scope.Complete();  
  40. }  
  41. }  
  42. catch  
  43. {   
  44. }  
  45. AppDomain.CreateDomain("Server").DoCallBack(delegate  
  46. {  
  47. ServiceHost host = new ServiceHost(typeof(MyService),
    new Uri("net.msmq://localhost/private/myqueue"));  
  48. host.AddServiceEndpoint(typeof(IService), 
    new NetMsmqBinding(NetMsmqSecurityMode.None), "");  
  49. host.Open();  
  50. });  
  51. }  

這里需要對(duì) "消息" 做一個(gè)澄清,當(dāng)客戶端發(fā)出調(diào)用(call)時(shí),調(diào)用會(huì)被轉(zhuǎn)換成 WCF Message,然后被包裝到 MSMQ Message 中。如果客戶端事務(wù)完成提交,那么 MSMQ Message 會(huì)被傳遞到隊(duì)列并存儲(chǔ)起來。相反,如果事務(wù)失敗,消息會(huì)被丟棄。上面的例子中,我們將多個(gè)調(diào)用放到一個(gè)環(huán)境事務(wù)中,也可以將多個(gè)服務(wù)調(diào)用放到一個(gè)事務(wù)當(dāng)中。如果隊(duì)列服務(wù)不在當(dāng)前機(jī)器上,也就是說使用 Public Queue 時(shí),客戶端的消息隊(duì)列組件將承擔(dān) "代理(proxy)" 的角色??蛻舳说恼{(diào)用會(huì)首先存儲(chǔ)到本地隊(duì)列,然后再由本地隊(duì)列轉(zhuǎn)發(fā)給目標(biāo)隊(duì)列。這個(gè)轉(zhuǎn)發(fā)過程同樣受到事務(wù)保護(hù)。

要是開發(fā)非事務(wù)性消息隊(duì)列服務(wù),需要用到 NetMsmqBinding 的兩個(gè)屬性。將 Durable 設(shè)為 false,表示不使用事務(wù)方式訪問消息隊(duì)列。另外還得將 ExactlyOnce 設(shè)為 false,否則會(huì)拋出 InvalidOperationException 異常。

下面例子中,重啟消息隊(duì)列服務(wù)(Message Queuing)后,你會(huì)發(fā)現(xiàn)消息丟失。

  1. [ServiceContract]  
  2. public interface IService  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void Test(int i);  
  6. }  
  7. [ServiceBehavior]  
  8. public class MyService : IService  
  9. {  
  10. public MyService()  
  11. {  
  12. Console.WriteLine("Constructor...");  
  13. }  
  14. [OperationBehavior(TransactionScopeRequired=true)]  
  15. public void Test(int i)  
  16. {  
  17. Console.WriteLine(i);  
  18. }  
  19. }  
  20. public class WcfTest  
  21. {  
  22. public static void Test()  
  23. {  
  24. MessageQueue.Delete(@".\private$\myqueue");  
  25. MessageQueue.Create(@".\private$\myqueue");  
  26. NetMsmqBinding binding1 = new NetMsmqBinding
    (NetMsmqSecurityMode.None);  
  27. binding1.Durable = false;  
  28. binding1.ExactlyOnce = false;  
  29. IService client = ChannelFactory<IService>
    .CreateChannel(binding1,  
  30. new EndpointAddress("net.msmq://localhost/private/myqueue"));  
  31. using (client as IDisposable)  
  32. {  
  33. for (int i = 0; i < 10; i++)  
  34. {  
  35. client.Test(i);  
  36. }  
  37. }  
  38. Console.WriteLine("重啟MSMQ服務(wù),然后按任意鍵繼續(xù)...");  
  39. Console.ReadKey(true);  
  40. AppDomain.CreateDomain("Server").DoCallBack(delegate  
  41. {  
  42. NetMsmqBinding binding2 = new NetMsmqBinding
    (NetMsmqSecurityMode.None);  
  43. binding2.Durable = false;  
  44. binding2.ExactlyOnce = false;  
  45. ServiceHost host = new ServiceHost(typeof(MyService),
    new Uri("net.msmq://localhost/private/myqueue"));  
  46. host.AddServiceEndpoint(typeof(IService), binding2, "");  
  47. host.Open();  
  48. });  
  49. }  

【編輯推薦】

  1. PDA訪問WCF實(shí)現(xiàn)重點(diǎn)在過程
  2. WCF標(biāo)準(zhǔn)終結(jié)點(diǎn)基本概念剖析
  3. WCF回調(diào)操作是雞應(yīng)用技巧講解
  4. WCF元數(shù)據(jù)交換應(yīng)用技巧分享
  5. IIS托管WCF服務(wù)實(shí)際操作中常見錯(cuò)誤分析
責(zé)任編輯:曹凱 來源: 豆豆網(wǎng)
相關(guān)推薦

2010-03-01 14:50:30

WCF行為類型

2009-12-21 10:27:52

WCF基本概念

2010-02-23 16:32:29

WCF服務(wù)

2009-12-21 15:33:07

WCF集合元素

2010-03-01 18:04:35

WCF配置綁定

2010-02-24 17:17:04

WCF宿主環(huán)境

2010-03-01 16:25:07

WCF體系架構(gòu)

2009-12-21 14:37:14

2010-03-01 16:41:04

WCF數(shù)據(jù)表

2010-03-02 16:22:31

WCF狀態(tài)應(yīng)用

2009-12-21 16:52:02

WCF序列化

2009-12-22 10:16:54

WCF服務(wù)狀態(tài)

2010-02-25 14:46:31

2010-03-02 11:10:43

WCF標(biāo)準(zhǔn)終結(jié)點(diǎn)

2010-03-01 17:57:11

WCF緩存機(jī)制

2011-03-28 11:05:17

ODBC

2010-03-03 15:10:49

第三方Python庫(kù)

2014-04-16 15:11:19

Spark

2009-03-20 11:46:10

MGCP協(xié)議網(wǎng)關(guān)

2012-09-11 14:39:03

Moosefs
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)