WCF分布式开发之MSMQ消息队列

 更新时间:2022年05月09日 10:55:02   作者:springsnow  
这篇文章介绍了WCF分布式开发之MSMQ消息队列,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、MSMQ简介

MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。

MSMQ与XML Web Services和.Net Remoting一样,是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时,Client端需要和Server端实时交换信息,Server需要保持联机。MSMQ则可以在Server离线的情况下工作,将Message临时保存在Client端的消息队列中,以后联机时再发送到Server端处理。

1、MSMQ的实现原理

消息的发送者把自己想要发送的信息放入一个容器,然后把它保存到一个系统公用空间的消息队列中,本地或异地的消息接收程序再从该队列中取出发给它的消息进行处理。

消息队列是一个公用存储空间,它可以存在于内存中或物理文件中,因此,消息以两种方式发送,即快递方式和可恢复模式。MSMQ机制类似QQ消息传递机制。下图演示了MSMQ的实现原理。

2、安装

默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应用程序服务器,双击它进入详细资料中选择消息队列一项进行安装。

如果服务没有自动启动,需要启动服务: 
这里写图片描述

3、两个概念

一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。

另一个是队列Queue:用来保存消息的存储空间,消息对列分为3类:

  • 公共队列:MachineName\QueueName 
    能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
  • 专用队列:MachineName\Private$\QueueName 
    只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。
  • 日志队列:MachineName\QueueName\Journal$

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

  • Create方法:创建使用指定路径的新消息队列。
  • Delete方法:删除现有的消息队列。
  • Existe方法:查看指定消息队列是否存在。
  • GetPublicQueues方法:在“消息队列”网络中定位消息队列。
  • Send方法:发送消息到指定的消息队列。
  • GetAllMessages()方法:得到队列中的所有消息。
  • Receive/BeginReceive方法:检索指定消息队列中最前面的消息,并将其从该队列中移除
  • Peek/BeginPeek方法:查看某个特定队列中的消息队列,但不从该队列中移出消息。。
  • Purge方法:清空指定队列的消息。

二、服务端

首先,实现服务器端。创建一个控制台项目,添加System.Messaging引用,因为消息队列的类全部封装在System.Messaging.dll程序集里。

服务器端代码需要注意的是,公共队列只能在域环境中创建,如果个人电脑没有加入域环境,则不能创建公共队列。

    if (!MessageQueue.Exists(@".\MYFIRSTMSMQ"))
    {
        using (MessageQueue mq = MessageQueue.Create(@".\MYFIRSTMSMQ"))//创建一个公共消息队列
        {
            mq.Label = "myFirstMSMQ";
            Console.WriteLine("已经创建了一个公共队列{0}", mq.Label);
            Console.WriteLine("公共队列{0}的路径为{1}", mq.Label, mq.Path);
            mq.Send("MSMQ 消息", "今天又学到个有趣的知识");
        }
    }
    foreach (MessageQueue mq in MessageQueue.GetPublicQueues())//获取所有公共队列,发送消息
    {
        mq.Send("发送公共消息队列" + DateTime.Now.ToLongTimeString(), "今天又学到个有趣的知识");
        Console.WriteLine("公有消息已经送到{0}", mq.Path);
    }

    if (!MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))
    {
        using (MessageQueue mq = MessageQueue.Create(@".\Private$\MYFIRSTMSMQ"))//创建一个私有消息队列
        {
            mq.Label = "myFirstPrivateMSMQ";
            Console.WriteLine("已经创建了一个私有队列{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");//找到私有队列,发送消息

        mq.Send("发送私有消息队列" + DateTime.Now.ToLongTimeString() + "今天又学到个有趣的知识");
        Console.WriteLine("私有消息已经送到{0}", mq.Path);
    }

三、客户端

服务器端把消息发送到共享的消息队列中,然后,客户端从这个共享的消息队列中取出消息进行处理。

if (MessageQueue.Exists(@".\MYFIRSTMSMQ"))// 获取公共消息队列
{
    using (MessageQueue mq = new MessageQueue(@".\MYFIRSTMSMQ"))//创建消息队列对象
    {
        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"))
    {
        //....
    }
}

到此这篇关于WCF分布式开发之MSMQ消息队列的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • c# 用Dictionary实现日志数据批量插入

    c# 用Dictionary实现日志数据批量插入

    这篇文章主要介绍了c# 用Dictionary实现日志数据批量插入的步骤,帮助大家更好的理解和使用c#中的Dictionary类,感兴趣的朋友可以了解下
    2021-02-02
  • C# 编码好习惯,献给所有热爱c#的同志

    C# 编码好习惯,献给所有热爱c#的同志

    c#编写者,需要培养的一些好习惯
    2009-02-02
  • C# Main方法的传入参数研究

    C# Main方法的传入参数研究

    这篇文章主要介绍了C# Main方法的传入参数研究,相信大家不管是在java中还是C#中都经常见到public static void Main(string[] args)类似的语句,那这个args到底有什么用,你又知道多少呢?本文就专门研究了这个参数,相信可以让涨姿势,需要的朋友可以参考下
    2015-06-06
  • C#静态构造函数用法实例分析

    C#静态构造函数用法实例分析

    这篇文章主要介绍了C#静态构造函数用法,以实例形式较为详细的分析了C#静态构造函数的用途、实现方法及使用技巧,需要的朋友可以参考下
    2015-06-06
  • 积累Visual Studio 常用快捷键的动画演示

    积累Visual Studio 常用快捷键的动画演示

    在代码开发过程中,频繁的使用键盘、鼠标操作非常麻烦,影响程序的开发效率。如何操作能用键盘来操作,那就节省时间了。下面小编把我平时积累的有关visul studio 常用快捷键的动画演示分享给大家,仅供大家参考
    2015-10-10
  • C#中ValueTuple的原理详解

    C#中ValueTuple的原理详解

    C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化:ValueTuple,下面这篇文章主要给大家介绍了关于C#中ValueTuple原理的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-06-06
  • C#实现文件压缩与解压功能的示例代码

    C#实现文件压缩与解压功能的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现文件压缩与解压功能,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-05-05
  • C#使用OpenCV剪切图像中的圆形和矩形的示例代码

    C#使用OpenCV剪切图像中的圆形和矩形的示例代码

    这篇文章主要介绍了C#使用OpenCV剪切图像中的圆形和矩形,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • C#托管内存与非托管内存之间的转换的实例讲解

    C#托管内存与非托管内存之间的转换的实例讲解

    在本篇文章里小编给大家整理了关于C#托管内存与非托管内存之间的转换的实例以及相关知识点,需要的朋友们学习下。
    2019-08-08
  • C#/VB.NET实现PPT或PPTX转换为图像功能

    C#/VB.NET实现PPT或PPTX转换为图像功能

    由于大多数便携式设备支持浏览图片而不支持浏览PowerPoint 文件,所以相比较而言,图像对于用户而言更加友好。本文将利用C#/VB.NET实现PPT或PPTX转换为图像功能,需要的可以参考一下
    2022-08-08

最新评论