[索引页]
[×××] 


化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)


作者:webabcd


介绍
WCF(Windows Communication Foundation) - 消息队列(MSMQ - MicroSoft Message Queue):
    netMsmqBinding的binding属性配置如下:
    ·ExactlyOnce - 确保消息只被投递一次。只能应用于事务型队列,默认值 ture
    ·Durable - 消息是否需要持久化。默认值 enabled,如果设置为disable,当MSMQ服务重启后,先前保存在MSMQ中的消息将会丢失
    ·TimeToLive - 消息过期并且从原有的队列移动到死信队列的时间。默认值 1.00:00:00 (1天)
    ·ReceiveRetryCount - 配置队列管理器在一定重试间隔中,尝试重新投递消息的次数,也就是将消息传输到重试队列前尝试发送该消息的最大次数(每隔RetryCycleDelay的时间重试ReceiveRetryCount次)。缺省值 5
    ·MaxRetryCycles - 配置队列管理器重新投递消息的重试间隔数(执行RetryCycleDelay的次数),也就是重试最大周期数。缺省值 2
    ·RetryCycleDelay - 表示两次重试之间的间隔时间,也就是重试周期之间的延迟。缺省值 00:30:00
    ·ReceiveErrorHandling - 指定如何处理错误的消息。Fault、Drop、Reject或Move(具体说明查MSDN)
    ·DeadLetterQueue - 指定所使用的死信队列的类型。None、System、或Custom(具体说明查MSDN)
    ·CustomDeadLetterQueue - 本地自定义死信队列的URI


示例
1、服务
IMSMQ.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;

namespace WCF.ServiceLib.Message
{
         ///
         /// 演示MSMQ的接口
         ///

         ///
        /// DeliveryRequirements - 指定绑定必须提供给服务或客户端实现的功能要求
        /// QueuedDeliveryRequirements - 指定服务的绑定是否必须支持排队协定
        /// QueuedDeliveryRequirementsMode.Allowed - 允许排队传送
        /// QueuedDeliveryRequirementsMode.Required - 要求排队传送
        /// QueuedDeliveryRequirementsMode.NotAllowed - 不允许排队传送
        ///

        [ServiceContract]
        [DeliveryRequirements(QueuedDeliveryRequirements = QueuedDeliveryRequirementsMode.Required)]
         public interface IMSMQ
        {
                 ///
                 /// 将字符串写入文本文件
                 ///

                 /// "str">需要写入文本文件的字符串

                 ///
                /// 如果要使用 MSMQ 的话,则必须配置IsOneWay = true
                ///

                [OperationContract(IsOneWay = true)]
                 void Write( string str);
        }
}
 
MSMQ.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;

namespace WCF.ServiceLib.Message
{
         ///
         /// 演示MSMQ的类
         ///

         public class MSMQ : IMSMQ
        {
                 ///
                 /// 将字符串写入文本文件
                 ///

                 /// "str">需要写入文本文件的字符串

                 public void Write( string str)
                {
                        System.IO.StreamWriter sw = new System.IO.StreamWriter( @"C:\WCF_Log_MSMQ.txt", true);
                        sw.Write(str);
                        sw.WriteLine();
                        sw.Close();
                }
        }
}
 
2、宿主
MSMQ.cs
// 队列名
// 只能使用.\private$\YourPrivateMSMQName来访问本机的私有MSMQ队列
string queueName = @".\private$\SampleMSMQ";

// 没有queueName队列,则创建queueName队列
if (!System.Messaging.MessageQueue.Exists(queueName))
{
         // 第二个参数为是否创建事务性队列
        System.Messaging.MessageQueue.Create(queueName, true);
}

using (ServiceHost host = new ServiceHost( typeof(WCF.ServiceLib.Message.MSMQ)))
{
        host.Open();

        Console.WriteLine( "服务已启动(WCF.ServiceLib.Message.MSMQ)");
        Console.WriteLine( "按停止服务");
        Console.ReadLine();

}
 
App.config


        
                
                        
                        
                        
                                
                                
                                
                                
                                
                                
                                
                                        
                                                
                                                
                                        

                                

                        

                

                
                        
                                
                                        
                                        
                                        
                                

                        

                

                
                        
                                
                                        
                                                
                                                
                                                
                                                

                                                
                                                
                                                
                                                
                                                

                                                
                                                
                                                
                                                
                                        

                                

                        

                

        

 
 
3、客户端
MSMQ.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;
using System.ServiceModel;

namespace Client2.Message
{
         ///
         /// 演示Message.MSMQ的类
         ///

         public class MSMQ
        {
                 ///
                 /// 用于测试 MSMQ 的客户端
                 ///

                 /// "str">需要写入文本文件的字符串

                 public void HelloMSMQ( string str)
                {
                         using (var proxy = new MessageSvc.MSMQ.MSMQClient())
                        {
                                proxy.Write(str);
                        }
                }            
        }
}
 
App.config


        
                
                        
                        
                        
                        
                                                        contract="MessageSvc.MSMQ.IMSMQ" bindingConfiguration="MSMQBindingConfiguration" />
                

                
                        
                                
                                        
                                                
                                                
                                                
                                                

                                                
                                                
                                                
                                                
                                                

                                                
                                                
                                                
                                                
                                        

                                

                        

                

        

 
 
运行结果:
客户端调用时,如果没有启动服务端,那么消息会进入到消息队列中。等到服务端启动后,会执行消息队列中的所有消息。


OK
[×××]