当前位置:编程学习 > 网站相关 >>

化零为整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
{
    /**//// <summary>
    /// 演示MSMQ的接口
    /// </summary>
    /// <remarks>
    /// DeliveryRequirements - 指定绑定必须提供给服务或客户端实现的功能要求
    /// QueuedDeliveryRequirements - 指定服务的绑定是否必须支持排队协定
    /// QueuedDeliveryRequirementsMode.Allowed - 允许排队传送
    /// QueuedDeliveryRequirementsMode.Required - 要求排队传送
    /// QueuedDeliveryRequirementsMode.NotAllowed - 不允许排队传送
    /// </remarks>
    [ServiceContract]
    [DeliveryRequirements(QueuedDeliveryRequirements = QueuedDeliveryRequirementsMode.Required)]
    public interface IMSMQ
    {
        /**//// <summary>
        /// 将字符串写入文本文件
        /// </summary>
        /// <param name="str">需要写入文本文件的字符串</param>
        /// <remarks>
        /// 如果要使用 MSMQ 的话,则必须配置IsOneWay = true
        /// </remarks>
        [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
{
    /**//// <summary>
    /// 演示MSMQ的类
    /// </summary>
    public class MSMQ : IMSMQ
    {
        /**//// <summary>
        /// 将字符串写入文本文件
        /// </summary>
        /// <param name="str">需要写入文本文件的字符串</param>
        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("按<ENTER>停止服务");
    Console.ReadLine();

}


App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <!--name - 提供服务的类名-->
            <!--behaviorConfiguration - 指定相关的行为配置-->
            <service name="WCF.ServiceLib.Message.MSMQ" behaviorConfiguration="MessageBehavior">
                <!--address - 服务地址-->
                <!--binding - 通信方式-->
                <!--contract - 服务契约-->
                <!--bindingConfiguration - 指定相关的绑定配置-->
                <endpoint address="" binding="netMsmqBinding" contract="WCF.ServiceLib.Message.IMSMQ" bindingConfiguration="MSMQBindingConfiguration" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:12345/Message/MSMQ"/>
                        <add baseAddress="net.msmq://localhost/private/SampleMSMQ"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
         

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,