最近研究了一下基于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 的企业应用解决方案的更多相关文章

  1. WCF MSMQ

    基于WCF MSMQ 的企业应用解决方案   最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是 ...

  2. 基于WCF 的远程数据库服务访问技术

    原文出处:http://www.lw80.cn/shuji/jsjlw/13588Htm.Htm摘要:本文介绍了使用WCF 建立和运行面向服务(SOA)的数据库服务的系统结构和技术要素,分析了WCF ...

  3. 基于MAXIMO的发电行业EAM解决方案

    1. 行业背景 随着我国以“厂网分开,竞价上网”为特点的电力市场的起步和发展,发电厂.发电集团成为独立企业参与市场竞争,原有的“生产型”管理模式已经不再适应市场的需求.发电企业在重视安全质量.保证电力 ...

  4. 企业bi解决方案,商业智能BI作用

    ​随着越来越多的公司将商业智能BI引入到日常运营和商业决策中,BI的热点逐渐起来了.商业智能系统兴起,那BI对企业有什么好处呢? 简单的说,就是可以帮助企业管理者直观清晰的看到自己想要关注的数据,帮助 ...

  5. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  6. 用C#基于WCF创建TCP的Service供Client端调用

    本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...

  7. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)

    1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...

  8. 基于K2的集成供应链流程解决方案

    基于K2的集成供应链流程解决方案http://www.k2software.cn/zh-hans/scm-solution 一.详细功能模块 需求管理模块多渠道管理.需求计划.需求感知与传递市场营销及 ...

  9. 基于QT的换肤整体解决方案(QSkinStyle)(提供Linux的XP风格)

    基于QT的换肤整体解决方案(QSkinStyle) 对QT这个成功的跨平台GUI库,本身内置了对换肤功能的实现,比如cleanlooks.plastique等跨平台风格:还有一些是和平台相关的风格,比 ...

随机推荐

  1. js array queue (队列)

    前言 今天项目中做一个图片效果展示,需要实时从后台获取图片数据,前段做展示.想想用到队列,比较好实现这个功能,只需要展示队列里的数据就可以了.于是写了个js 对列. js code /** * [Qu ...

  2. 替代jquery1.9版本以前的toggle事件函数(开关)

    以上文章为转载自http://blog.sina.com.cn/s/blog_50042fab0101c7a9.html var flag=1; $(".selector").cl ...

  3. Overview of OpenCascade Library

    Overview of OpenCascade Library eryar@163.com 摘要Abstract:对OpenCascade库的功能及其实现做简要介绍. 关键字Key Words:Ope ...

  4. 了解screen对象的常用视图属性

    前面的话 screen对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素高度和宽度等.每个浏览器中的screen对象都包含着各不相同的属性.本文将详细介绍screen对象的 ...

  5. Hibernate注解

    前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件.下面拿个小例子说一下. 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类 ...

  6. 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)

    上一节我们创建了 vxlan 100_net,今天将部署 instance 并分析网络的连通性. launch 新的 instance "cirros-vm1",网络选择 vxla ...

  7. 【记录】AutoMapper Project To not support ResolveUsing

    示例代码: public List<OrderLineDTO> GetLinesForOrder(int orderId) { Mapper.CreateMap<OrderLine, ...

  8. 用JqueryUI的Dialog+IFrame实现仿模态窗口效果

    大家有没有想过这样一个问题,当我点击某个图片的时候,我想弹出这个图片信息的详情并修改,于是你首先想到的是不是window.open?window.open方法确实可以,但是有它的局限性,比如,标题显示 ...

  9. 【Java基础】并发

    Num1:同步访问共享的可变数据 关键字Synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块.. 同步不仅仅理解为互斥的方式,如果没有同步,一个线程的变化就不能 ...

  10. Fragment基础----生命周期

    Fragment生命周期和Activity对比 注意:在一个app的运行期间,前台的activity有时可能会被其他的视图组件打断,然后进入pause状态. 比如打开一个半透膜的activity (比 ...