日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCFMSMQ隊列基本概念簡述

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

站在用戶的角度思考問題,與客戶深入溝通,找到威海網(wǎng)站設計與威海網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋威海地區(qū)。

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

 
 
 
  1. // 創(chuàng)建事務性隊列
  2. MessageQueue.Create(@".\private$\myqueue", true);
  3. // 創(chuàng)建非事務性隊列
  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.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. }
  52. }

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

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

下面例子中,重啟消息隊列服務(Message Queuing)后,你會發(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
    .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服務,然后按任意鍵繼續(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. }
  50. }

分享名稱:WCFMSMQ隊列基本概念簡述
本文來源:http://m.5511xx.com/article/djocdpc.html