这里主要讲解WCF结合Microsoft Messaging Queue(MSMQ)实现的消息队列,本实例属于测试用例,与实际项目编码相差甚远,所以暂不能用于实际项目中.希望以后慢慢完善.
在一些业务场景中,如果服务端与消费段发生了网络问题或者是需要批量提交数据,那么使用消息队列再合适不过了,比如商城订单系统等等.
MSMQ的配置
在开始之前,需要确定机器本身已经安装了MSMQ服务,具体的安装方法如下:
操作完成上面步骤以后,MSMQ这一块基本上完成,接下来开始配置WCF部分.
WCF的配置
首先创建一个Console Application程序,然后引用 System.ServiceModel程序集,然后编写如下Service:
using System; using System.ServiceModel; namespace MSMQWCFDaemon { public class Service:iService { public void Operation() { Console.WriteLine("Hello MessageQueue"); } } [ServiceContract] public interface iService { [OperationContract(IsOneWay = true)] void Operation(); } }
代码很简单,就是在服务端简单的打印出 Hello MessageQueue字样.
这一步做完后,我们需要编写代码来启动服务,在启动服务前,我们需要配置App.config文件,这里我不进行手动配置,而是采用WCF Service Configuration Editor来配置.
在VS中,单击 Tools -> WCF Service Configuration Editor,打开编辑器,具体的编辑方法,请参见我以前的文章<<基于net.tcp的WCF配置实例解析>>,下面列出配置不一样的地方:
首先,配置得选择MSMQ方式:
其次,选择让WCF Client进行连接
然后,配置连接字串为: net.msmq://localhost/private/requestqueue
最后,需要设置exactlyOnce="false",用来打开Transaction功能.
设置完成后,将生成的App.config文件保存到MSMQWCFDaemon项目下,然后编写如下代码以便启动Service:
using System; using System.ServiceModel; using System.ServiceModel.Description; namespace MSMQWCFDaemon { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(Service))) { ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); if (smb == null) host.Description.Behaviors.Add(new ServiceMetadataBehavior()); //expose metadata to let SvcUntil.exe generate the config file and proxy class host.AddServiceEndpoint(typeof(IMetadataExchange),MetadataExchangeBindings.CreateMexHttpBinding(),"mex"); host.Open(); Console.WriteLine("Service listen begin to listen..."); Console.WriteLine("press any key to teriminate..."); Console.ReadKey(); host.Abort(); host.Close(); } } } }
好了,F5一下,我们看到服务端启动了.
然后需要做的是编写客户端代码,我们首先需要利用SvcUntil.exe工具生成客户端配置文件和代理类,这个请参见之前的文章: <<基于net.tcp的WCF配置实例解析>>,生成完成后拷贝到Client项目中,然后编写如下代码调用服务端函数:
using System; namespace MSMQWCFClient { class Program { static void Main(string[] args) { iServiceClient client = new iServiceClient(); client.Operation(); Console.ReadKey(); } } }
测试结果
下面就来测试我们做好的消息队列:
首先,开启服务端,然后开启客户端,我们看到服务端成功接收了数据,MSMQ队列中无记录:
然后把服务端停止,连续启动三次客户端,可以看到如下记录:
然后打开服务端,看到三条存在于MSMQ的记录都被推送了出去:
希望对你有用
源码下载