欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WCF分布式開發(fā)之MSMQ消息隊列

 更新時間:2022年05月09日 10:55:02   作者:springsnow  
這篇文章介紹了WCF分布式開發(fā)之MSMQ消息隊列,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、MSMQ簡介

MSMQ(微軟消息隊列)是Windows操作系統(tǒng)中消息應用程序的基礎,是用于創(chuàng)建分布式、松散連接的消息通訊應用程序的開發(fā)工具。

MSMQ與XML Web Services和.Net Remoting一樣,是一種分布式開發(fā)技術(shù)。但是在使用XML Web Services或.Net Remoting組件時,Client端需要和Server端實時交換信息,Server需要保持聯(lián)機。MSMQ則可以在Server離線的情況下工作,將Message臨時保存在Client端的消息隊列中,以后聯(lián)機時再發(fā)送到Server端處理。

1、MSMQ的實現(xiàn)原理

消息的發(fā)送者把自己想要發(fā)送的信息放入一個容器,然后把它保存到一個系統(tǒng)公用空間的消息隊列中,本地或異地的消息接收程序再從該隊列中取出發(fā)給它的消息進行處理。

消息隊列是一個公用存儲空間,它可以存在于內(nèi)存中或物理文件中,因此,消息以兩種方式發(fā)送,即快遞方式和可恢復模式。MSMQ機制類似QQ消息傳遞機制。下圖演示了MSMQ的實現(xiàn)原理。

2、安裝

默認情況下安裝操作系統(tǒng)是不安裝消息隊列的,你可以在控制面板中找到添加/刪除程序,然后選擇添加/刪除Windows組件一項,然后選擇應用程序服務器,雙擊它進入詳細資料中選擇消息隊列一項進行安裝。

如果服務沒有自動啟動,需要啟動服務: 
這里寫圖片描述

3、兩個概念

一個是消息Message:Message是通信雙方需要傳遞的消息,它可以是文本、圖片、視頻等。消息包含發(fā)送和接收者的標識,只有指定的用戶才能取得消息。

另一個是隊列Queue:用來保存消息的存儲空間,消息對列分為3類:

  • 公共隊列:MachineName\QueueName 
    能被別的機器所訪問,如果你的多個項目中用到消息隊列,那么你可以把隊列定義為公共隊列
  • 專用隊列:MachineName\Private$\QueueName 
    只針對于本機的程序才可以調(diào)用的隊列,有些情況下為了安全起見定義為私有隊列。
  • 日志隊列:MachineName\QueueName\Journal$

4、MicroSoft.Message.Queue常用的方法:

  • Create方法:創(chuàng)建使用指定路徑的新消息隊列。
  • Delete方法:刪除現(xiàn)有的消息隊列。
  • Existe方法:查看指定消息隊列是否存在。
  • GetPublicQueues方法:在“消息隊列”網(wǎng)絡中定位消息隊列。
  • Send方法:發(fā)送消息到指定的消息隊列。
  • GetAllMessages()方法:得到隊列中的所有消息。
  • Receive/BeginReceive方法:檢索指定消息隊列中最前面的消息,并將其從該隊列中移除
  • Peek/BeginPeek方法:查看某個特定隊列中的消息隊列,但不從該隊列中移出消息。。
  • Purge方法:清空指定隊列的消息。

二、服務端

首先,實現(xiàn)服務器端。創(chuàng)建一個控制臺項目,添加System.Messaging引用,因為消息隊列的類全部封裝在System.Messaging.dll程序集里。

服務器端代碼需要注意的是,公共隊列只能在域環(huán)境中創(chuàng)建,如果個人電腦沒有加入域環(huán)境,則不能創(chuàng)建公共隊列。

    if (!MessageQueue.Exists(@".\MYFIRSTMSMQ"))
    {
        using (MessageQueue mq = MessageQueue.Create(@".\MYFIRSTMSMQ"))//創(chuàng)建一個公共消息隊列
        {
            mq.Label = "myFirstMSMQ";
            Console.WriteLine("已經(jīng)創(chuàng)建了一個公共隊列{0}", mq.Label);
            Console.WriteLine("公共隊列{0}的路徑為{1}", mq.Label, mq.Path);
            mq.Send("MSMQ 消息", "今天又學到個有趣的知識");
        }
    }
    foreach (MessageQueue mq in MessageQueue.GetPublicQueues())//獲取所有公共隊列,發(fā)送消息
    {
        mq.Send("發(fā)送公共消息隊列" + DateTime.Now.ToLongTimeString(), "今天又學到個有趣的知識");
        Console.WriteLine("公有消息已經(jīng)送到{0}", mq.Path);
    }

    if (!MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))
    {
        using (MessageQueue mq = MessageQueue.Create(@".\Private$\MYFIRSTMSMQ"))//創(chuàng)建一個私有消息隊列
        {
            mq.Label = "myFirstPrivateMSMQ";
            Console.WriteLine("已經(jīng)創(chuàng)建了一個私有隊列{0}", mq.Label);
            Console.WriteLine("私有隊列{0}的路徑為{1}", mq.Label, mq.Path);
            mq.Send("MSMQ 私有隊列消息" + "今天又學到個有趣的知識");
        }
    }

    if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))
    {
        MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ");//找到私有隊列,發(fā)送消息

        mq.Send("發(fā)送私有消息隊列" + DateTime.Now.ToLongTimeString() + "今天又學到個有趣的知識");
        Console.WriteLine("私有消息已經(jīng)送到{0}", mq.Path);
    }

三、客戶端

服務器端把消息發(fā)送到共享的消息隊列中,然后,客戶端從這個共享的消息隊列中取出消息進行處理。

if (MessageQueue.Exists(@".\MYFIRSTMSMQ"))// 獲取公共消息隊列
{
    using (MessageQueue mq = new MessageQueue(@".\MYFIRSTMSMQ"))//創(chuàng)建消息隊列對象
    {
        mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//設置消息隊列的格式化器,還有BinaryMessageFormatter,ActiveXMessageFormatter等
        foreach (Message msg in mq.GetAllMessages())
        {
            Console.WriteLine("接收到的消息是:{0}", msg.Body);
        }
        Message firstmsg = mq.Receive();
        Console.WriteLine("收到的第一條消息為:{0}", firstmsg.Body);
    }
}

if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))// 獲取私有消息隊列
{
    using (MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ"))
    {
        //....
    }
}

到此這篇關(guān)于WCF分布式開發(fā)之MSMQ消息隊列的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c# 用Dictionary實現(xiàn)日志數(shù)據(jù)批量插入

    c# 用Dictionary實現(xiàn)日志數(shù)據(jù)批量插入

    這篇文章主要介紹了c# 用Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的步驟,幫助大家更好的理解和使用c#中的Dictionary類,感興趣的朋友可以了解下
    2021-02-02
  • C# 編碼好習慣,獻給所有熱愛c#的同志

    C# 編碼好習慣,獻給所有熱愛c#的同志

    c#編寫者,需要培養(yǎng)的一些好習慣
    2009-02-02
  • C# Main方法的傳入?yún)?shù)研究

    C# Main方法的傳入?yún)?shù)研究

    這篇文章主要介紹了C# Main方法的傳入?yún)?shù)研究,相信大家不管是在java中還是C#中都經(jīng)常見到public static void Main(string[] args)類似的語句,那這個args到底有什么用,你又知道多少呢?本文就專門研究了這個參數(shù),相信可以讓漲姿勢,需要的朋友可以參考下
    2015-06-06
  • C#靜態(tài)構(gòu)造函數(shù)用法實例分析

    C#靜態(tài)構(gòu)造函數(shù)用法實例分析

    這篇文章主要介紹了C#靜態(tài)構(gòu)造函數(shù)用法,以實例形式較為詳細的分析了C#靜態(tài)構(gòu)造函數(shù)的用途、實現(xiàn)方法及使用技巧,需要的朋友可以參考下
    2015-06-06
  • 積累Visual Studio 常用快捷鍵的動畫演示

    積累Visual Studio 常用快捷鍵的動畫演示

    在代碼開發(fā)過程中,頻繁的使用鍵盤、鼠標操作非常麻煩,影響程序的開發(fā)效率。如何操作能用鍵盤來操作,那就節(jié)省時間了。下面小編把我平時積累的有關(guān)visul studio 常用快捷鍵的動畫演示分享給大家,僅供大家參考
    2015-10-10
  • C#中ValueTuple的原理詳解

    C#中ValueTuple的原理詳解

    C# 7.0已經(jīng)出來一段時間了,大家都知道新特性里面有個對元組的優(yōu)化:ValueTuple,下面這篇文章主要給大家介紹了關(guān)于C#中ValueTuple原理的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-06-06
  • C#實現(xiàn)文件壓縮與解壓功能的示例代碼

    C#實現(xiàn)文件壓縮與解壓功能的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)文件壓縮與解壓功能,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下
    2023-05-05
  • C#使用OpenCV剪切圖像中的圓形和矩形的示例代碼

    C#使用OpenCV剪切圖像中的圓形和矩形的示例代碼

    這篇文章主要介紹了C#使用OpenCV剪切圖像中的圓形和矩形,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例講解

    C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例講解

    在本篇文章里小編給大家整理了關(guān)于C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例以及相關(guān)知識點,需要的朋友們學習下。
    2019-08-08
  • C#/VB.NET實現(xiàn)PPT或PPTX轉(zhuǎn)換為圖像功能

    C#/VB.NET實現(xiàn)PPT或PPTX轉(zhuǎn)換為圖像功能

    由于大多數(shù)便攜式設備支持瀏覽圖片而不支持瀏覽PowerPoint 文件,所以相比較而言,圖像對于用戶而言更加友好。本文將利用C#/VB.NET實現(xiàn)PPT或PPTX轉(zhuǎn)換為圖像功能,需要的可以參考一下
    2022-08-08

最新評論