本章我们来了解下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 = , 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读取队列中的消息.

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

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

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

    .Net Remoting技术,我们可以将其看作是一种分布式处理方式.作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程 ...

  2. WCF分布式开发必备知识(3):Web Service 使用

    参考地址:http://www.cnblogs.com/zhili/p/WebService.html 一.WebService概述 SOAP.WSDL.UDDISOAP(Simple Object ...

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

    1.打开”服务器管理器“------”功能“-------”添加功能“,勾选”消息队列“,如下图: 如果之前已经勾选,则忽略此步. 2.”功能“------”消息队列“------”专有对列“---- ...

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

    之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...

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

    众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...

  6. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

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

    本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为 ...

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

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

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

    今天继续WCF分布式开发步步为赢系列的第4节:WCF服务可靠性传输配置与编程开发.这个章节,我们要介绍什么是WCF服务的可靠性传输,随便介绍网络协议的概念,Web Service为什么不支持可靠性传出 ...

随机推荐

  1. Python自动化之多进程

    多进程multiprocessing from multiprocessing import Process import os def info(title): print(title) print ...

  2. [CQOI2011]动态逆序对

    (又是一道树套树……自己真是玩疯了……) (题意略) 从网上也看过题解,好像解法很多……比如CDQ+树状数组,树状数组套主席树,树状数组套平衡树……我用的是树状数组套splay. (我会说是因为我不会 ...

  3. Java验证码识别解决方案

    建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...

  4. 11.8---维护x的秩(CC150)

    思路:比较easy.就是借助hashset让他有序然后就能够比较节省时间了. 答案: public static int[] getRankOfNumber(int[] a, int n){ int[ ...

  5. 2.4---把链表划分为两部分(CC150)

    注意,题目要求要保持两部分的相对顺序,所以,用交换是不行的. import java.util.HashSet; import java.util.Set; class ListNode{ int v ...

  6. Struts2学习笔记《二》

    struts.xml配置文件的全部配置元素:

  7. Griddle, griddle-react 一个REACT 表格组件

    Griddle, griddle-react 一个REACT 表格组件: http://griddlegriddle.github.io/Griddle/index.html

  8. 多国语言文档识别 ABBYY FineReader Corporate v12.0.101.388.7z 绿色破解版

    ABBYY 是一家俄罗斯软件公司,在文档识别,数据捕获和语言技术的开发中居世界领先地位.其获奖产品 FineReader OCR 软件可以把静态纸文件和 PDF 文件转换成可管理的电子数据,可以大大节 ...

  9. Effective C++ -----条款49:了解new-handler 的行为

    set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用. Nothorw new 是一个颇为局限的工具,因为它只适用于内存分配:后继的构造函数调用还是可能抛出异常.

  10. mysql中Access denied for user 'root'@'localhost' (using password:YES)

    关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑. 今早打开电脑,开始-运行 输入“mysql -uroot -pmyadmin”后出现以下错误: “Access ...