WCF分布式开发必备知识(1):MSMQ消息队列

本章我们来了解下MSMQ的基本概念和开发过程。
MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间的任一位置。
它的实现原理是:消息的发送者要把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中,本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
其中两个重要的概念。一个是消息Message,一个是队列Queue。

消息可以是各式各样的媒体,如文本、声音、图像等等。消息的最终理解方式,为消息传递的双方事先商定,这样的好处是,一是相当于对数据进行了简单的加密,二则采用自己定义的格式可以节省通信的传递量。消息可以含有发送和接受者的标识,只有指定的用户才能看到回执。
时间戳,便于接受方对某些与时间相关的应用进行处理。截止时间,指定时间内消息还到达则作废。

队列的类型主要包括以下几种:
“公共队列”在整个消息队列网络中复制,并且有可能由网络连接的所有站点访问。
“专用队列”不在整个网络中发布。相反,他们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。
“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望MessageQueue组件使用的管理队列(如果有的话)
“响应队列”包含目标应用程序接收消息时返回给发送应用程序的响应消息。指定希望MessageQueue组件使用的响应队列(如果有的话)。

消息队列是发送和接收消息的公用存储空间,它可以存在于内存中或者是物理文件中。消息可以以两种方式发送,即快递方式(express)和可恢复模式(recoverable),它们的区别在于,快递方式为了消息放置于内存中,可恢复模式放于物理磁盘上。

消息队列的优缺点
优点:稳定、消息优先级、脱机能力以及安全性,有保障的消息传递和执行许多业务处理的可靠地仿故障机制。
缺点:MSMQ不适合客户端需要服务器端实时交互情况,大量请求时候,响应延迟。

首先我们先要安装消息队列服务器并且开启消息队列服务,以下是代码实现:

首先,创建一个控制台项目(当然你也可以创建Web或者Winform应用程序).添加项目引用System.Messaging,因为消息队列相关的类库全部封装在System.Messaging.dll程序集里了.下面我们就来写自己的代码.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;
using Model;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string msmqName = @".\YXLMSMQ";
            string privateMsmqName = @".\Private$\YXLMSMQ";
            //你在创建公有队列,而你的机器不属于任何域。一般工作组安装的计算机只能创建私有队列。
            //if (!MessageQueue.Exists(msmqName))//判断此路径下是否已经有该队列
            //{
            //    using (MessageQueue mq = MessageQueue.Create(msmqName))
            //    {
            //        mq.Label = "YXLPublicQueue"; //设置队列标签
            //        Console.WriteLine(mq.Path); //队列路径
            //        Console.WriteLine(mq.QueueName);
            //        mq.Send("Send To MSMQ Object", "YXLMSMQLabel");//发送消息
            //    }
            //}
            //创建私有消息队列
            if (!MessageQueue.Exists(privateMsmqName))//判断此路径下是否已经有该队列
            {
                using (MessageQueue mq = MessageQueue.Create(privateMsmqName))
                {
                    mq.Label = "YXLPrivateQueue"; //设置队列标签
                    Console.WriteLine(mq.Path); //队列路径
                    Console.WriteLine(mq.QueueName);
                    mq.Send("Send To Private MSMQ Object", "YXLMSMQLabel1");//发送消息
                }
            }
            //获取公共消息队列并且发送消息
            //foreach (MessageQueue mq in MessageQueue.GetPublicQueues())
            //{
            //    mq.Send("Sending MSMQ public message" + DateTime.Now.ToLongDateString(), "YXLMSMQLabel");//发送公共消息
            //    Console.WriteLine(mq.Path);
            //}
            //找到私有的消息队列并且发送消息
            if (MessageQueue.Exists(privateMsmqName))//判断此路径下是否已经有该队列
            {
                using (MessageQueue mq = new MessageQueue(privateMsmqName))
                {

                    //mq.Send("Send MSMQ Private message" + DateTime.Now.ToLongDateString(), "YXLMSMQLabel2");
            //发送复杂类型
                    mq.Send(new User() {Id = 1, Name = "张三"}, "YXLMSMQLabelUser");
                    //发送消息到私有队列里
                    Console.WriteLine(mq.Path);
                }
            }

        }
    }

}

比较重要的类就是MessageQueue,这行代码创建消息队列 MessageQueue mq = MessageQueue.Create(privateMsmqName),参数是存放消息队列的位置.这个基本就完成了创建和发送消息的主程序.下面我们来建立一个客户端,来访问消息队列,获取消息,同样建立一个控制台应用程序,添加引用和代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;
using Model;

namespace ConsoleApplicationMSMQClient
{
    class Program
    {
        static void Main(string[] args)
        {

            string privateMsmqName = @".\Private$\YXLMSMQ";

            //找到私有的消息队列并且发送消息
            if (MessageQueue.Exists(privateMsmqName))//判断此路径下是否已经有该队列
            {
                using (MessageQueue mq = new MessageQueue(privateMsmqName))
                {
                    //mq.Formatter = new XmlMessageFormatter(new string[]{"System.String"});//设置消息队列格式化器
                       //Console.WriteLine(message.Body);
                    mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(User) });
                    Message message =  mq.Receive();
                    User user = message.Body as User;
                    Console.WriteLine(user.Id+"-------"+user.Name);

                }
            }
        }
    }
}

消息接收同样需要实例化一个消息队列对象, using(MessageQueue mq = new MessageQueue(privateMsmqName))负责创建消息队列对象.其次 mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" })这行代码负责设置消息队列的格式化器,因为消息的传递过程中存在格式化的问题.我们接收消息的时候必须指定消息队列的格式化属性Formatter,队列才能接受消息.XmlMessageFormatter的作用是进行消息的XML串行化.BinaryMessageFormatter则把消息格式化为二进制数据进行传输.ActiveXMessageFormatter把消息同样进行二进制格式化,区别是可以使用COM读取队列中的消息.

当然消息队列还可以发送复杂的对象,前提是这个对象要可串行化,具体的格式取决与队列的格式化器设置.此外消息队列还支持事务队列来确保消息只发送一次和发送的顺序.

时间: 2024-11-03 21:14:08

WCF分布式开发必备知识(1):MSMQ消息队列的相关文章

WCF分布式开发必备知识(2):.Net Remoting

.Net Remoting技术,我们可以将其看作是一种分布式处理方式.作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程序的通信.从微软的产品角度来看,可以说Remoting就是分布式组件DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下..NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架.这也正是我们使用Remoting的原因.为什么呢?在Windows操作系统中,

在window 2008r2开发服务器上安装MSMQ消息队列

1.打开"服务器管理器"------"功能"-------"添加功能",勾选"消息队列",如下图: 如果之前已经勾选,则忽略此步. 2."功能"------"消息对了"------"专有对列"-----右键"新建",如下图: 3.输入名称即可,如下图: 原文地址:https://www.cnblogs.com/qk2014/p/8848307.ht

WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ消息队列的基本概念.安装.部署.开发.调试等相关问题.今天我们来学习WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ.在WCF框架下使用MSMQ消息队列服务编程.  这里我会给出一个使用WCF MSMQ实现离线请求的DEMO示例程序. 全文结构是:[1]MSMQ基本概念[2]W

WCF分布式开发步步为赢(1):WCF分布式框架基础概念

众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推出了自己的中间件产品,比如Oracle Fusion和 SAP NetWeaver,IBM.BEA等企业也推出了自己基于SOA的解决方案.基于J2EE平台的SOA架构设计中的一个重要概念就是EJB企业服务总线,作用是实现各个系统的数据交互.而.NET平台上,WCF就是微软为各个系统的数据交互提供通讯

WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. 作为面向服务应用的开发平台,WCF也提供了对事物编程模型的支持..NET 2.0提供的System.Transactions类来开发事务应用程序.同样WCF也支持事务特性,WCF事务机制是什么,它与微软已有的技术如Microsoft 分布式事务协调器 (MSDTC)有何关系?与Enterpise

WCF分布式开发步步为赢(7):WCF数据契约与序列化

本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为什么会有序列化机制?或者说它是为了解决什么问题?作用是什么?现有的.NET 序列化机制和WCF序列化机制有什么不同?我们在本节文章里都会详细介绍.本节结构:[0]数据契约[1]序列化基本概念[2].NET 序列化机制[3]WCF序列化机制[4]代码实现与分析[5]总结. 下面我们正式进入今天的学习阶

WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发

今天继续WCF分布式开发步步为赢系列的第4节:WCF服务可靠性传输配置与编程开发.这个章节,我们要介绍什么是WCF服务的可靠性传输,随便介绍网络协议的概念,Web Service为什么不支持可靠性传出,具体的WCF绑定协议和可靠性的关系,实现可靠性传输有什么方式,以及配置和开发的详细实现代码分析部分.[1]可靠性传输[2]配置方式实现可靠性传输[3]编程方式实现可靠性传输[4]编程实现必备有序传递[5]结果分析和总结. 下面进入正式的内容: [1]可靠性传输: [1.0]网络协议基础知识: 这里

WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)

今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle).本节内容作为WCF分布式开发的一个重要知识点,无论在学习还是项目中都应该有所了解.此前也和多位学习爱好者讨论过WCF异常处理的相关知识.这里就系统整理一下,共大家参考.同时也是对<WCF分布式开发步步为赢>系列文章的完善和补充.   本节主要涉及的知识点就是:[1].NET异常处理[2]WCF异常处理[3]错误契约[4]WCF异常处理扩展[5]示例代码分析,最后是[

WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计

上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依据?面向对象的设计经验有何值得借鉴的地方?这里我们会一一给出详细的介绍.本文首先介绍的是WCF服务中契约继承的一些概念.例子代码分析,其次来讲解服务契约的设计问题.首先介绍的也是进行服务设计的必要性,服务设计的原则,示例代码分析.最后是全文的总结部分.结构如下:[1]OO面向对象设计原则,[2]服务