最近研究了一下基于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. salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态

    项目中,申请者申请某些事项以后,常常需要在申请列表中查看当前申请的记录所在的审批状态,动态美观的显示状态可以使UI更符合客户要求,比如下面这样. 以Goods__c表为例,申请者申请的一些采购以前需要 ...

  2. js创建与追加元素

    用javascript创建元素 : var NewNode = document.creatElement('div'); 结合appendChild与insertBefore插入到DOM树中 ins ...

  3. JS原生第六篇 (帅哥)

    复习 按钮不可用    disabled =  "disabled"  ||  true setTimeout   只执行一次    setInterval  执行很多次 递归调用 ...

  4. Nokia 920板砖自救(理论上通用,升级Win10成板砖也可以用这个恢复)

    异常处理汇总 ~ 修正果带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4599258.html 个人博客:http://dnt.dkill.net 下载下 ...

  5. LINQ系列:LINQ to XML类

    LINQ to XML由System.Xml.Linq namespace实现,该namespace包含处理XML时用到的所有类.在使用LINQ to XML时需要添加System.Xml.Linq. ...

  6. OpenCascade MeshVS Usage

    OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...

  7. es6学习笔记一数组(中)

    接着上一篇,给大家再分享一些数组的其他方法.大家也可以去点击这里学习数组更多的方法 concat方法: 概述:    concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回. ...

  8. MVC4做网站后台:用户管理 —用户

    这块进行用户管理,可以浏览.查询已注册的用户,修改用户资料,删除用户等.没有做添加用户,不知是否必要.列表页还是使用easyui的datagrid.这个思路跟用户组的方式差不多. 1.接口Interf ...

  9. 深入学习jQuery动画控制

    × 目录 [1]动画状态 [2]停止动画 [3]动画延迟[4]全局控制 前面的话 jQuery动画可以使用fade.hide.slide等方法实现基本动画效果,可以使用animate实现自定义动画,甚 ...

  10. MySQL学习笔记五:数据类型

    MySQL支持多种数据类型,大致可以分为数值,日期/时间和字符类型. 数值类型 MySQL支持所有标准SQL数值数据类型,包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUM ...