成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF MSMQ隊列基本概念簡述

開發 開發工具
WCF MSMQ隊列的類型可以被分為兩種,一種為事務性隊列,而另外一種則為非事務性隊列。接下來我們將會針對這方面知識做一個詳細介紹。

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

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

  1. // 創建事務性隊列  
  2. MessageQueue.Create(@".\private$\myqueue", true);  
  3. // 創建非事務性隊列  
  4. MessageQueue.Create(@".\private$\myqueue"); 

通過下面的例子我們會看到事務失敗時,沒有任何消息被寫入隊列。

  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. }  

這里需要對 "消息" 做一個澄清,當客戶端發出調用(call)時,調用會被轉換成 WCF Message,然后被包裝到 MSMQ Message 中。如果客戶端事務完成提交,那么 MSMQ Message 會被傳遞到隊列并存儲起來。相反,如果事務失敗,消息會被丟棄。上面的例子中,我們將多個調用放到一個環境事務中,也可以將多個服務調用放到一個事務當中。如果隊列服務不在當前機器上,也就是說使用 Public Queue 時,客戶端的消息隊列組件將承擔 "代理(proxy)" 的角色。客戶端的調用會首先存儲到本地隊列,然后再由本地隊列轉發給目標隊列。這個轉發過程同樣受到事務保護。

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

下面例子中,重啟消息隊列服務(Message Queuing)后,你會發現消息丟失。

  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服務,然后按任意鍵繼續...");  
  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實現重點在過程
  2. WCF標準終結點基本概念剖析
  3. WCF回調操作是雞應用技巧講解
  4. WCF元數據交換應用技巧分享
  5. IIS托管WCF服務實際操作中常見錯誤分析
責任編輯:曹凱 來源: 豆豆網
相關推薦

2010-03-01 14:50:30

WCF行為類型

2009-12-21 10:27:52

WCF基本概念

2010-02-23 16:32:29

WCF服務

2009-12-21 15:33:07

WCF集合元素

2010-03-01 18:04:35

WCF配置綁定

2010-02-24 17:17:04

WCF宿主環境

2010-03-01 16:25:07

WCF體系架構

2009-12-21 14:37:14

2010-03-01 16:41:04

WCF數據表

2010-03-02 16:22:31

WCF狀態應用

2009-12-21 16:52:02

WCF序列化

2009-12-22 10:16:54

WCF服務狀態

2010-02-25 14:46:31

2010-03-02 11:10:43

WCF標準終結點

2010-03-01 17:57:11

WCF緩存機制

2011-03-28 11:05:17

ODBC

2010-03-03 15:10:49

第三方Python庫

2014-04-16 15:11:19

Spark

2009-03-20 11:46:10

MGCP協議網關

2012-09-11 14:39:03

Moosefs
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久香蕉网 | 国产精品日韩在线观看 | 久久国产精品一区二区三区 | www.99热.com | 中文字幕亚洲欧美 | 欧美久久久电影 | 国产999精品久久久久久 | 一区二区三区四区在线视频 | 精品人伦一区二区三区蜜桃网站 | a级网站| 自拍偷拍精品 | 久久久美女 | 婷婷久久综合 | 中国一级特黄毛片大片 | 伊人网综合 | 91九色在线观看 | a看片 | 欧美亚洲成人网 | 性国产xxxx乳高跟 | 夜夜爽99久久国产综合精品女不卡 | 国产69精品久久久久777 | 久久成人18免费网站 | 国产一二三区在线 | 日本在线小视频 | 国产精品综合一区二区 | 国产成人精品一区二三区在线观看 | 亚洲免费在线播放 | 国产精品久久久久久久久久 | 96av麻豆蜜桃一区二区 | 午夜小视频在线播放 | 精品一区二区免费视频 | 久久久91精品国产一区二区精品 | 国产xxxx岁13xxxxhd | 伊人狠狠 | 日日天天 | 中文字幕在线观看av | a免费视频| 拍真实国产伦偷精品 | 精品久久久久久久久久久院品网 | www四虎影视 | 久久久久香蕉视频 |