• MSMQ学习笔记


    这几天学习了一下MSMQ,虽然不能说非常深入的了解其机制与实际用法(具体项目的实现),但也要给自己的学习做个总结。学习心得如下:

    一、MSMQ即微软消息队列。用于程序之间的异步消息通信,主要的机制就是在某种情况将消息以队列的形式存于公共的空间,又在特定条件下进行相应的处理。

    二、MSMQ的使用:

      1、安装系统消息队列。【控制面板】--【卸载程序】--【关闭/打开windows功能】--添加MSMQ功能。如下图所示

      2、MessageQueue在System.Messaging命名空间下的。能够清楚的知道MessageQueue的内部方法和属性就可以数量的使用Msmq了。先列举几个比较常用的方法:

    a、MessageQueue的类方法:

    MessageQueue.Create(string path)---新建路径为path的消息队列(非事务型)

    MessageQueue.Create(string path,bool transactional)----新建路径为path的消息队列(是否为事务型由transactional决定)

    MessageQueue.Exists(string path)---判断是否已经存在路径为path的消息队列

    MessageQueue.Delete(string path)--删除路径为path的消息队列

    b、MessageQueue中的实例方法:

    ---BeginPeek(); 异步获取队列中的第一条消息,但不删除

    ---Peek(); 获取队列中的第一条消息,但不删除

    ---BeginReceive();异步获取队列中的第一条消息,同时删除

    ---Receive();获取队列中的第一条消息,同时删除

    ---Send(object obj);向队列中添加消息,object一般指定为Message对象

    ---GetAllMessages();获取队列中的所有消息,同时删除

    ---Purge(); 清空队列

    ---Formatter属性-----有两种形式,一种是二进制的形式(BinaryMessageFormatter),另一种是Xml形式(XmlMessageFormatter)

    三、使用事例的部分代码:

    1、创建

     1  MessageQueue messageQueue = null;
     2         string path = @".private$Message";
     3         /// <summary>
     4         /// 打开对应的Msmq
     5         /// </summary>
     6         /// <param name="path">msmq路径</param>
     7         /// <param name="transactional">是否为事务</param>
     8         public void OpenMq(string path,bool transactional)
     9         {
    10            
    11             if (MessageQueue.Exists(path))
    12             {
    13                 messageQueue = new MessageQueue(path);//注意已经存在该路径的msmq,其事务性是不可修改的
    14             }
    15             else
    16             {
    17                 messageQueue = MessageQueue.Create(path,transactional);
    18             }
    19 
    20         }

    2、发送消息至队列

             /// <summary>
            /// 二进制进队
            /// </summary>
            /// <param name="entity">可序列化对象</param>
            public void SendBinary(Entity entity)
            {
                messageQueue.Send(new Message(entity, new BinaryMessageFormatter()));
            }
            /// <summary>
            /// xml进队
            /// </summary>
            /// <param name="o"></param>
            public void SendXml(object o)
            {
                messageQueue.Send(new Message(o, new XmlMessageFormatter()));
            }
    
            /// <summary>
            /// 事务进队
            /// </summary>
            /// <param name="entity">可序列化对象</param>
            /// <param name="ent">可序列化对象</param>
            /// <param name="msg"></param>
            /// <param name="flag">true为xml,false为binary</param>
            public void XmlSendWithTrans(Entity entity, Ent ent, string msg, bool flag)
            {
                if (flag)
                    mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Entity), typeof(Ent), typeof(string) });
                else
                {
                    messageQueue.Formatter = new BinaryMessageFormatter();
                }
                if (messageQueue.Transactional)
                {
                    MessageQueueTransaction mqt = new MessageQueueTransaction();
                    mqt.Begin();
                    messageQueue.Send(new Message(entity), mqt);
                    messageQueue.Send(new Message(ent), mqt);
                    messageQueue.Send(new Message(msg), mqt);
                    mqt.Commit();
                }
    
            }

    3、读取消息(使用Receive,读后删除)

    1)非事务同步读取

     1        /// <summary>
     2        /// 读取消息并删除
     3        /// </summary>
     4        /// <returns></returns>
     5         public Message Receive()
     6         {
     7             messageQueue.Formatter = new BinaryMessageFormatter();
     8             try
     9             {
    10                 return messageQueue.Receive(new TimeSpan(0, 0, 1));
    11             }
    12             catch (Exception ex)
    13             {
    14                 throw;
    15               // return new Message(ex.Message);
    16             }
    17         }

    2)异步的读取(略)

    至于其它方法都是差不多的,也不做代码说明了。主要是Message类中的Body属性是对象的信息承载体。

    最后:关于MSMQ在具体项目中的应用还是比较期待的,希望有朝一日能在真实项目中用上,这才是重点。

     

    Top
    收藏
    关注
    评论
  • 相关阅读:
    系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式[转]
    EF RepositoryBase 参考示例【转】
    Entity Framework 杂碎
    Oracle.ManagedDataAccessDTC.dll 使用
    c# http请求,获取非200时的响应体
    c# windows service(服务)
    git log
    解决冲突
    clone命令
    remote指令添加远程数据库
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4212286.html
Copyright © 2020-2023  润新知