zoukankan      html  css  js  c++  java
  • WCF消息队列

    这里主要讲解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的记录都被推送了出去:

     

    希望对你有用

    源码下载

    点击这里下载源码

  • 相关阅读:
    C# 依赖注入中的 控制反转(Assembly)实现
    C# 依赖注入中的 控制反转(Assembly)实现
    Asp.net web form 动态生成控件的注意事项
    jackson的转换object转map
    SpringCloud+Feign+Hystrix使用FallbackFactory统一处理,查看服务调用异常或失败,进入熔断降级处理的原因
    feign调用返回object类型转换成实体
    Springboot @ResponseBody返回中文乱码
    Feign 传参问题及传输Date类型参数的时差 坑
    Mybatis plus条件构造器QueryWrapper的简单用法
    Java命令里面的EQ、NE、GT、LT、GE、LE分别代表含义
  • 原文地址:https://www.cnblogs.com/scy251147/p/2871153.html
Copyright © 2011-2022 走看看