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

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

新聞中心

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

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

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

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ù)來(lái)保護(hù)對(duì)消息的操作。一但服務(wù)器發(fā)生問(wèn)題,或者調(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");

通過(guò)下面的例子我們會(huì)看到事務(wù)失敗時(shí),沒(méi)有任何消息被寫入隊(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.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. }

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

要是開發(fā)非事務(wù)性消息隊(duì)列服務(wù),需要用到 NetMsmqBinding 的兩個(gè)屬性。將 Durable 設(shè)為 false,表示不使用事務(wù)方式訪問(wèn)消息隊(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
    .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. }
  50. }

新聞名稱:WCFMSMQ隊(duì)列基本概念簡(jiǎn)述
URL分享:http://www.5511xx.com/article/djocdpc.html