基于WCF MSMQ 的企业应用解决方案
最近研究了一下基于MSMQ的WCF应用,从书上、网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案。索性还是自己做个实验,探索一下吧。经过反复试验,颇有收获,现跟大家分享一下。
首先我的解释一下为什么查了那么多资料却未能理解WCF-MSMQ的工作原理,不是各位大牛没有把原理讲清楚,而是大多数给出的例子都是在单机上运行的,这就很难说明白离线工作的原理。
为了说明问题,我用了四台虚机来部署我的实验程序,首先我给大家看一下我的程序部署结构:

4台虚机(红线表示消息流向),它们的操作系统都是Windows2008 R2,并且都需要安装MSMQ服务,否则无法工作。也就是说,如果应用程序客户端发布出去以后,要想实现离线提交,在客户端机器上也必须安装MSMQ服务。
- WCF Host (10.222.114.76):这台机器用来运行Service程序,它的主要任务是监听MSMQ Host这台机器上的队列。
- MSMQ Host (10.222.114.78):这台机器用来提供消息服务;当然完全可以由这4台机器的任何一台作为MSMQ的消息服务器,我MSMQ Host这台机器是为了说明一个问题,稍后会提到。
- WCF Client 1 (10.222.114.77),WCF Client 2 (10.222.114.79):用来运行客户端程序,当然我们可以有无数个客户端。
接下来看一下WCF程序的配置:
服务端
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="msmqBinding" queueTransferProtocol="Srmp">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<services>
<service name="WCF.Msmq.MsmqService">
<endpoint address="net.msmq://10.222.114.78/private/myqueue" binding="netMsmqBinding"
bindingConfiguration="msmqBinding" contract="WCF.Msmq.IMsmqService" />
</service>
</services>
</system.serviceModel>
客户端
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="netMsmqBinding" queueTransferProtocol="Srmp">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<client>
<endpoint address="net.msmq://10.222.114.78/private/myqueue" binding="netMsmqBinding"
bindingConfiguration="netMsmqBinding" contract="WCF.Msmq.IMsmqService"
name="msmqserivce" />
</client>
</system.serviceModel>
有一点需要指出,那就是Address。和其它绑定方式不同,使用MSMQ的WCF的地址并不是本机IP(大家可以看到我的WCF Host这台机器的IP是10.222.114.76,像我们常用的basicHttpBingding,WSHttpBingDing等地址指向都是本机地址),而是MSMQ Host那台虚机的IP地址。这就是我为什么把专门用MSMS Host单独拿出来作为消息服务器的原因。另外, queueTransferProtocol="Srmp"用的使用 SOAP 可靠消息传送协议 (SRMP),需要安装HTTP支持,可以直接把它删掉使用默认的Native方式。
这里代码我就不往上贴了,看一下执行过程吧,WCF Client 1,WCF Client 2往MSMQ Host这台机器上发送消息,WCF Host监控MSMQ Host这台机器上的private/myqueue对列,一旦有消息,则把消息提取出来进行处理。下面是我的程序运行结果,在运行程序之前,需要在MSMQ Host上创建一个私有队列private/myqueue。
| WCF Client 1执行结果 | WCF Client 2执行结果 | WCF Host 执行结果 |
![]() |
![]() |
![]() |
我们接下来看下离线工作。我们把WCF Client 1的网卡禁用,或者停掉MSMQ Host,会看到以下结果,在Outgonging队列里堆积了很多发不出去的消息。这就是为什么在客户端需要安装MSMQ服务的原因。一旦WCF Client 1与MSMQ Host再次建立连接,在Outgoing队列里的消息就会被发送到MSMQ Host上去。

关闭WCF Host中我们运行的Service程序,这时会看到,在MSMQ Host这台机器上private/myqueue对列中的消息越积越多。等到再次启动Service后,它里面的消息就会被处理掉。

经过上面的实验,可以得到一下结论:WCF Host,MSMQ Host,WCF Client这三台机器任何一台发生故障,应用都是可恢复的,而且数据不会丢失。
接下来我还做了另一个实验,就是在另外一台机器上启动新建的WCF服务程序,发现两个Service都可以去处理同一队列中的消息,从这种意义上来说,这不失是一个负载均衡的一个解决方案。
最后,附上我的实验代码,供大家参考:Msmq.7z
基于WCF MSMQ 的企业应用解决方案的更多相关文章
- WCF MSMQ
基于WCF MSMQ 的企业应用解决方案 最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是 ...
- 基于WCF 的远程数据库服务访问技术
原文出处:http://www.lw80.cn/shuji/jsjlw/13588Htm.Htm摘要:本文介绍了使用WCF 建立和运行面向服务(SOA)的数据库服务的系统结构和技术要素,分析了WCF ...
- 基于MAXIMO的发电行业EAM解决方案
1. 行业背景 随着我国以“厂网分开,竞价上网”为特点的电力市场的起步和发展,发电厂.发电集团成为独立企业参与市场竞争,原有的“生产型”管理模式已经不再适应市场的需求.发电企业在重视安全质量.保证电力 ...
- 企业bi解决方案,商业智能BI作用
随着越来越多的公司将商业智能BI引入到日常运营和商业决策中,BI的热点逐渐起来了.商业智能系统兴起,那BI对企业有什么好处呢? 简单的说,就是可以帮助企业管理者直观清晰的看到自己想要关注的数据,帮助 ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- 用C#基于WCF创建TCP的Service供Client端调用
本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- 基于K2的集成供应链流程解决方案
基于K2的集成供应链流程解决方案http://www.k2software.cn/zh-hans/scm-solution 一.详细功能模块 需求管理模块多渠道管理.需求计划.需求感知与传递市场营销及 ...
- 基于QT的换肤整体解决方案(QSkinStyle)(提供Linux的XP风格)
基于QT的换肤整体解决方案(QSkinStyle) 对QT这个成功的跨平台GUI库,本身内置了对换肤功能的实现,比如cleanlooks.plastique等跨平台风格:还有一些是和平台相关的风格,比 ...
随机推荐
- 《Node web开发》笔记
还是因为学习kibana,才开始了解node. Node是一种基于事件驱动的异步系统,基于Chrome的引擎V8. Node中由于大量的使用模块,因此出现了很多开源模块,有点像java社区的样子. 笔 ...
- ASP.NET Core - ASP.NET Core MVC 的功能划分
概述 大型 Web 应用比小型 Web 应用需要更好的组织.在大型应用中,ASP.NET MVC(和 Core MVC)所用的默认组织结构开始成为你的负累.你可以使用两种简单的技术来更新组织方法并及时 ...
- Box Model,边距折叠,内联和块标签,CSSReset
一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...
- SQL Server中的事务与锁
了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...
- OpenNURBS 3DM Viewer
OpenNURBS 3DM Viewer eryar@163.com Abstract. The openNURBS Toolkit consists of C++ source code for a ...
- WPF做验证码,小部分修改原作者内容
原文地址:http://www.cnblogs.com/tianguook/p/4142346.html 首先感谢aparche大牛的帖子,因为过两天可能要做个登录的页面,因此,需要用到验证码,从而看 ...
- ELF文件
ELF文件格式是一个开发标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型: 可重定位的目标文件 可执行文件 共享库 现在分析一下上一篇文章中经过汇编之后生成的目标文件max.o和 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
- Bootstrap Metronic 学习记录(一)简介
1.简介 是一个基于Bootstrap 3.x的高级管理控制面板主题.Bootstrap Metronic - 是一个完全响应式管理模板.基于Bootstrap3框架.高度可定制的,易于使用.适合从小 ...
- php学习零散笔记—字符串分割、fetch函数和单双引号。
1 字符串分割——split()函数和preg_split()函数 split — 用正则表达式将字符串分割到数组中——貌似PHP5.3以上已不赞成使用 array split ( string $p ...


