一、引言

Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能,并提供了与消息队列(MSMQ)、COM+、Asp.net Web服务、.NET Remoting等微软现有的分布式系统技术。利用WCF平台,开发人员可以很方便地构建面向服务的应用程序(SOA)。可以认为,WCF是对之前现有的分布式技术(指的是MSMQ、.NET Remoting和Web 服务等技术)的集成和扩展,既然这样,我们就有必要首先了解下之前分布式技术,只有这样才能更深刻地明白WCF所带来的好处。今天就分享下MSMQ这种分布式技术。

二、MSMQ的介绍

MSMQ全称是Microsoft Message Queue——微软消息队列。它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。

2.1 MSMQ 工作原理2

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

消息队列是一个公用存储空间,它可以存在于内存中或物理文件中,因此,消息以两种方式发送,即快递方式和可恢复模式。它们的区别是消息存储位置的不同,快递方式,为了消息的快速传递,所以把消息放置在内存中,而不放在物理磁盘上,以获得较高的处理能力;而可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘上,这样当保存消息队列的机器发生故障而重新启动后,可以把发送的消息恢复到故障发送之前的状态,以获得更好的消息恢复能力。消息队列可以放在发送方、接收方所在的机器上,也可以单独放置在另外一台机器上。另外,采用消息队列机制,发送方不必要担心接收方是否启动,是否发生故障等因素,只要消息成功发送出去,就可以认为处理完成,而实际上对方可能甚至未开机,或者实际消息传递到对方可能在第二天。MSMQ机制类似QQ消息传递机制。下图演示了MSMQ的实现原理。

MSMQ中主要有两个概念。

  • 一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。
  • 一个是队列Queue:用来保存消息的存储空间,MSMQ中主要包括以下几种队列类型:机器日志队列对应的格式为:机器名称Journal$;
  • 机器死信队列对应的格式为:机器名称Deadletter$;
  • 机器信道死信队列对应的格式为:机器名称XactDeadletter$。
  • 公共队列:在整个消息队列网络中复制,有可能由网络连接的所有站点访问。路径格式为:机器名称队列名称
  • 专用队列(或叫私有队列):不在整个网络中发布,它们仅在所驻留的本地计算机上可用,专用队列只能由知道队列的完整路径名称或标签的应用程序访问。路径格式为:机器名称Private$队列名称
  • 日志队列:包含确认在给定“消息队列中发送的消息回执消息”。路径格式为:机器名称队列名称Journal$
  • 响应队列:包含目标应用程序接收到消息时返回给发送应用程序的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列。

2.2 队列引用说明

当创建了一个MessageQueue实例之后,就应指明和哪个队列进行通信,在.NET中有3种访问指定消息队列的方法:

  • 使用路径,消息队列的路径被机器名和队列名唯一确定,所以可以用消息队列路径来指明使用的消息队列。
  • 使用格式名(format name),它是由MSMQ在消息队列创建时生成的唯一标识,个使命不由用户指定,而是由队列管理者自动生成的GUID。
  • 使用标识名(label),它是消息队列创建时由消息管理者指定的带有意义的名字。

三、消息队列的优缺点

采用消息队列的好处是:由于是异步通信,无论是发送方还是接收方都不同等待对方返回成功消息,就可以执行余下的代码,大大提高了处理的能力;在信息传递过程中,具有故障恢复能力;MSMQ的消息传递机制使得通信的双方具有不同的物理平台成为可能。

消息队列缺点是:不适合Client需要Server端实时交互情况,大量请求时候,响应可能延迟。对于客户端,必须是Windows系统。可以通过连接器跟其他的非微软技术集成。

四、利用MSMQ开发分布式应用

4.1 环境准备

要想在.NET平台进行MSMQ的开发,需要安装消息队列,你需要打开控制面板->程序->打开或关闭Windows功能,勾选消息队列服务所有选项,具体操作如下图所示:

勾选完之后点击确定之后,可以在我的电脑->管理->服务和应用程序->消息队列 看到下面的图:

看到上面这个图代表你已经成功配置了MSMQ的开发环境,下面就可以使用Visual Studio 进行开发。注意,对特定类型队列的操作代码,一定要成功安装对应的队列类型。

4.2 使用MSMQ开发分布式应用

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

using System;using System.Messaging;namespace MSMQServer{ class Program {  static void Main(string[] args) { // 创建一个公共队列,公共队列只能创建在域环境里 //if (!MessageQueue.Exists(@".LearningHardMSMQ")) // 判断此路径下是否已经有该队列 //{ // using (MessageQueue mq = MessageQueue.Create(@".LearningHardMSMQ")) // { // mq.Label = "LearningHardQueue"; // 设置队列标签 // Console.WriteLine("已经创建了一个公共队列"); // Console.WriteLine("路径为:{0}

响应其他应用程序的系统菜单消息 insertmenu_「DDD」跟我一起学WCF(1)——MSMQ消息队列...相关推荐

  1. resultset需要关闭吗_Java程序员都需要懂的「反射」

    前言 只有光头才能变强.文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 今天来简单写一下Java的反射.本来没打算写反射这 ...

  2. win32应用程序_这个免费开源的「外挂」,让 Win32 老应用的字体更好看

    自 Windows 10 从 2014 年正式发行以来已经有快六年的时间了,然而六年后的今天,水深火热的 Windows 用户依旧要为 Windows 上一些使用着古老技术的客户端糟糕的字体渲染买单. ...

  3. GAN掉人脸识别系统?GAN模型「女扮男装」

    文章来源 新智元 编辑:LRS [新智元导读]人脸识别技术最近又有新的破解方式!一位斯坦福的学生使用GAN模型生成了几张自己的图片,轻松攻破两个约会软件,最离谱的是「女扮男装」都识别不出来. 真的有人 ...

  4. activemq后台管理 看topic消息_「Java」 - SpringBoot amp; ActiveMQ

    一.消息队列 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题,实现高性能.高可用.可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件. 目前在生产环境中使用较 ...

  5. c语言编写点餐系统的图形界面,「分享」C语言如何编写图形界面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面.大家也都有回答,需要其他的库.MFC,GTK,QT. 本人近期刚用GTK库加上纯C ...

  6. linux系统支持最大内存,「Linux」- 查找系统支持的最大内存 @20210225

    问题描述 机器支持的最大内存除了受操作系统的限制,还受到硬件芯片的寻址限制.如果使用64位操作系统,我们通常不需要担心操作系统限制.作为桌面用户,我们更需要关注硬件的最大内存限制. 本文通过使用命令找 ...

  7. 安卓版本发布之后遇到bug怎么办_随手解决安卓系统烦人的「BUG」,强迫症一定要这么做...

    昨天在应用商店看到一款新上架的小应用,名字巨长, 正在用 Android 8.0 的用户很熟悉了,XX 应用正在其他应用的上层显示内容,系统强制显示, 然后评论区一看,遍地都是吐槽这些既关不掉也不知道 ...

  8. [MFC]利用CMenu手工(非资源脚本)处理菜单、系统菜单

    1. 创建菜单: 1) 主要利用CMenu的三个成员函数CreateMenu.CreatePopupMenu.AppendMenu.SetMenu创建菜单: 2) BOOL CMenu::Create ...

  9. 【转载】组合模式-系统菜单的设计

    1. 系统菜单的设计 「系统菜单」应该是所有ERP系统都必备的一个基础模块,反正我是没见过哪个ERP系统是没有菜单设计的.典型的设计就是一个「树状结构」,数据库表用一个parent_id来构建整棵菜单 ...

最新文章

  1. python和c学习-关于本站 - cPython - 给大学生的入门教程
  2. 动图 + 源码,演示 Java 中常用数据结构执行过程及原理
  3. MIPI related
  4. 使用Python+turtle绘制同心圆
  5. exchange命令整理
  6. datatable如何生成级联数据_如何把Excel表数据批量生成条形码
  7. linux gcc matlab,Linux Matlab mex gcc 版本
  8. 从CentOS6.0i386到CentOS6.6x86-64,搬家中,磕磕跘跘,各种折腾……
  9. 华为新系统鸿蒙在哪更新,暂定3月,华为新系统登场!开始切换至鸿蒙OS,37款机型支持升级...
  10. 【2013年04月18号】
  11. Photoshop CC 2017安装
  12. 解决网易云音乐ubuntu客户端播放中无声音
  13. 年薪百万的年轻人都是怎样生活的
  14. 从零开始学飞塔第一篇:飞塔防火墙基本上网配置(PPPoE拨号固定IP上网)FortiGate Broadband internet access
  15. A-Frame使用方法 教程 API
  16. const int,int const,const int*,int const*,int* const有什么不一样?
  17. 组装网游服务器,网游服务器的搭建
  18. docker之nginx镜像优化4
  19. 人像照片后期调色效果lr预设
  20. DXF库(dxflib)使用指南

热门文章

  1. mac composer 安装
  2. cocos2d-x帧动画实现(续)
  3. 09hibernate_session_flush
  4. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)
  5. java猜数游戏有次数限制_幼小衔接可以用的超有趣的数学小游戏
  6. linux lids pdf,Linux入侵监测系统LIDS原理(3)
  7. python容易出错的地方_Python中try-except出错后如何从try出错地方继续执行?
  8. php 数组的深度,有没有办法找出PHP数组的“深度”?
  9. 代替嵌套循环java_蓝石榴_个人博客_Java中for循环嵌套的替换优化
  10. 《量化交易核心策略开发:从建模到实战》读书笔记