C#消息队列

一、Message Quenuing 5.0是windows Service 2008 R2和windows7的一部分。有4.0 ;3.0 ;2.0。

二、安装 控制面板, 程序,打开或关闭windows功能

三、guiden.exe创建类型ID是通用唯一的ID(UUID)或GUID;

四、Message类的Priority属性可以优先级。

读取消息队列时,默认情况下不读取消息的优先级,所以MessageQueue.MessageReadPropertyFilter.Priority = true;

五、Recoverable属性设置true使消息可以恢复。

六、因为默认情况下不读取消息的优先级,所以MessageReadPropertyFilter属性必须设置为接收Priority。(queue.MessageReadPropertyFilter.Priority=true)

View Code

七、MessageQueue.Send(对象)使用默认的XmlMessageFormatter序列化它,再把它写入队列中。

orderQueue.Formatter = new XmlMessageFormatter(
                new Type[]
                {
                    typeof(CourseOrder),
                    typeof(Customer),
                    typeof(Course)
                });

反序列化

 CourseOrder order = message.Body as CourseOrder;

 

八、因为线程不能把文本写入列表框中Dispatcher.Invoke()方法把请求写入创建线程中

Dispatcher.Invoke(DispatcherPriority.Normal,
                          new Action<LabelIdMapping>(AddListItem), labelId);

九、确认队列

1、Message.AdministrationQueue设置一个新的队列,把Message的AckowledgementType的属性设置为AcknowledgementTypes.FullReceive

2、如果把Message类的UseDeadLetterQueue设置为true,消息超时未到达目标队列时,该消息就会复制到死信队列中,TimeToReadchQueue和TimeToBeReceived设置超时时间。

3.响应队列

View Code
 void MessageFormatter(Message message)
        {
            Message responseMessage = new Message("response");
            responseMessage.CorrelationId =message.Id;// "原始消息的ID";
            message.ResponseQueue.Send(responseMessage);
        }

十、事物队列

1、消息的到达顺序与其发生的顺序相同。

2、消息只到达一次

3、给MessageQueue.Create()方法的第二参数设置true就会创建事物消息队列。

4、发生消息队列的队列

View Code
 void MessageTransaction()
        {
            if (!MessageQueue.Exists(@".\MyTransactionalQueue"))
            {
                MessageQueue.Create(@".\MyTransactionalQueue",true);
            }
            MessageQueue queue = new MessageQueue(@".\MyTransactionalQueue");
            Message message = new Message();
            message.Body = "创建消息队列事物";
            var transaction = new MessageQueueTransaction();
            try
            {
                transaction.Begin();
                queue.Send(message, transaction);
                queue.Send("a", transaction);
                transaction.Commit();
            }
            catch
            {
                transaction.Abort();
            }
           
           
        }

 

 

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Messaging;
namespace CreateMessageQueue
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 创建私有的队列消息
            //你在创建公有队列,而你的机器不属于任何域。一般工作组安装的计算机只能创建私有队列。
            //using (var queue = MessageQueue.Create(@".\Private$\MyNewPublicQueue"))
            //{
            //    queue.Label = "Demo Queue";
            //    Console.WriteLine("Queue created:");
            //    Console.WriteLine("地址{0}", queue.Path);
            //    Console.WriteLine("FormatName:{0}", queue.FormatName);
            //}
            #endregion

            #region 查找本机所有的私有队列消息
            //foreach (var queue in MessageQueue.GetPrivateQueuesByMachine("."))
            //{
            //    Console.WriteLine(queue.Path);
            //}
            #endregion

            #region 发送消息队列
            //if (MessageQueue.Exists(@".\Private$\MyNewPublicQueue"))
            //{
            //    var queue = new MessageQueue(@".\Private$\MyNewPublicQueue");
            //    //发送消息
            //    queue.Send("Sample Message","Label");
            //}
            //else
            //{
            //    Console.WriteLine("找不到公共的消息队列");
            //}
            #endregion

            #region 接收队列消息
            //var queue = new MessageQueue(@".\Private$\MyNewPublicQueue");
            //queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
            //Message message = queue.Receive();
            //Console.WriteLine(message.Body);
            #endregion

            #region 时间间隔收取
            //var queue = new MessageQueue(@".\Private$\MyNewPublicQueue");
            //queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
            //using (MessageEnumerator messages = queue.GetMessageEnumerator2())
            //{
            //    while (messages.MoveNext(TimeSpan.FromMinutes(30)))
            //    {
            //        Message message = messages.Current;
            //        Console.WriteLine(message.Body);
            //    }
            //}
            #endregion

            #region 异步收取消息队列
            var queue = new MessageQueue(@".\Private$\MyNewPublicQueue");
            queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
            queue.ReceiveCompleted += MessageArrived;
            queue.BeginReceive();
            #endregion
            Console.ReadKey();
        }

        public static void MessageArrived(object source, ReceiveCompletedEventArgs e)
        {
            MessageQueue queue = (MessageQueue)source;
            Message message = queue.EndReceive(e.AsyncResult);
            Console.WriteLine(message.Body);
        }
        /// <summary>
        /// 给队列发送复杂的消
        /// </summary>
        /// <param name="queue"></param>
        void MessageFormatter(Message message)
        {
            Message responseMessage = new Message("response");
            responseMessage.CorrelationId =message.Id;// "原始消息的ID";
            message.ResponseQueue.Send(responseMessage);
        }
        void MessageTransaction()
        {
            if (!MessageQueue.Exists(@".\MyTransactionalQueue"))
            {
                MessageQueue.Create(@".\MyTransactionalQueue",true);
            }
            MessageQueue queue = new MessageQueue(@".\MyTransactionalQueue");
            Message message = new Message();
            message.Body = "创建消息队列事物";
            var transaction = new MessageQueueTransaction();
            try
            {
                transaction.Begin();
                queue.Send(message, transaction);
                queue.Send("a", transaction);
                transaction.Commit();
            }
            catch
            {
                transaction.Abort();
            }
           
           
        }
    }
}

 

 

 

 

posted on 2013-03-03 17:05  R.Ray  阅读(535)  评论(0)    收藏  举报

导航