基于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等跨平台风格:还有一些是和平台相关的风格,比 ...
随机推荐
- mybatis的一些小总结
好长时间没用mybatis了,现在项目忽然用mybatis,用的过程中出现了些问题,虽然解决了,不过这花的时间有些长了.总结用的过程中出现的一些问题 1.mapper.xml 之前一直用的自动生成,现 ...
- python中configparser模块
python中的configparse模块的使用 主要用来解析一些常用的配置,比如数据配置等. 例如:有一个dbconfig.ini的文件 [section_db1] db = test_db1 ho ...
- Partition Stats
在分区表中,SQL Server使用一个唯一的分区ID(PartitionID)来标识一个分区,对于任何一个对象(table,index 或 indexed view),都有一个分区号(Prtitio ...
- jquery插件编写模版
jquery插件是什么??这里以讨论实力方法为主,比如 $("div").pluginname({}); 他的最简单形势应该是 $.prototype.plugin = funct ...
- JavaScript 面向对象继承的实现
<script type="text/javascript"> function Animal () { this.species="Animal" ...
- 深入学习jQuery自定义动画
× 目录 [1]属性对象 [2]可选参数 [3]选项参数 前面的话 很多情况下,前面介绍的jQuery动画的简单效果无法满足用户的各种需求,那么就需要对动画有更多的限制,需要采取一些高级的自定义动画来 ...
- Activity四种启动模式
转载博客:http://blog.csdn.net/shinay/article/details/7898492 Activity启动方式有四种,分别是:standardsingleTopsingle ...
- HTTP协议基础
一.介绍 Hyper Text Transfer Protocol(超文本传输协议)主要用于从WWW服务器传输超文本到本地浏览器的传送协议.已发展到1.1版本. 二.HTTP在TCP/IP参考模型的位 ...
- AngularJS之代码风格36条建议【一】(九)
前言 其实在新学一门知识时,我们应该注意下怎么书写代码更加规范,从开始就注意养成一个良好的习惯无论是对于bug的查找还是走人后别人熟悉代码都是非常好的,利人利己的事情何乐而不为呢,关于AngularJ ...
- IOS开发之微信山寨版
为了犒劳自己的学习内容,就山寨个微信的视图控制吧.拿着微信,仔细的看了一下,主要用到了TabBarController以及配置TabBarItem, NavigationController以及配置N ...


