这里主要讲解WCF结合Microsoft Messaging Queue(MSMQ)实现的消息队列,本实例属于测试用例,与实际项目编码相差甚远,所以暂不能用于实际项目中.希望以后慢慢完善.

在一些业务场景中,如果服务端与消费段发生了网络问题或者是需要批量提交数据,那么使用消息队列再合适不过了,比如商城订单系统等等.

MSMQ的配置

在开始之前,需要确定机器本身已经安装了MSMQ服务,具体的安装方法如下:

  1. 控制面板->添加删除程序->添加删除组件->选择Message Queue,点击添加
  2. 添加完毕后,可以通过我的电脑->管理来查看是否安装成功
  3. 检查Service.msc中的Message Queuing服务是否启动,没有启动的话,启动它.
  4. 由于测试的服务端和客户端都在一台机器上,所以我们需要用到Private queue,请右击我的电脑->管理->服务程序->Message Queuing->在Private Queues下面创建requestqueue和responsequeue.
  5. 创建完成后,在requestqueue上右击属性,然后在弹出的标签中选中”Security”标签,为当前用户附上所有权限.

操作完成上面步骤以后,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的记录都被推送了出去:

 

希望对你有用

源码下载

点击这里下载源码

 

posted on 2013-01-22 12:25  程序诗人  阅读(1779)  评论(0编辑  收藏  举报