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在具体项目中的应用还是比较期待的,希望有朝一日能在真实项目中用上,这才是重点。

 

时间: 2024-10-10 16:53:42

MSMQ学习笔记的相关文章

MSMQ学习笔记二——创建Message Queue队列

一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队列. 下面对MSDN上的创建Message Queue队列示例函数: HRESULT CreateMSMQQueue( LPWSTR wszPathName, PSECURITY_DESCRIPTOR pSecurityDescriptor, LPWSTR wszOutFormatName, DWO

Redis学习笔记~目录

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都 支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排 序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更

wcf 学习笔记1

1. wcf 中的所有消息均为SOAP消息,注意WCF的消息与传输协议无关,与WEB服务不同,因此WCF服务可以在不同的协议之间传输,而不仅限于HTTP 2. wcf的每一个服务都有一个唯一的地址,地址包含两个元素:服务位置和传输协议:服务位置包括机器名,站点,通讯端口,管道或队列,以及一个可选的特定路径或URI统一资源标识 3. wcf 通讯协议有:http ,tcp , peer network , ipc , msmq ,使用命名管道的服务只能接收来自同一台机器的调用,每台机器只能打开一个

wcf 学习笔记2

服务契约 我们知道,serviceContrac特性能够将接口或者类公开为面向服务的契约,允许开发者使用c#语言编程,把类似接口这样的语法结构公开为WCF契约和服务. 操作重载,基于WSDL的操作不支持操作重载,但是,我们可以手动的启动操作重载,使用operationContract特性的name属性,为操作指定别名,如下: [ServiceContract] interface ICalculator { [OperationContract(Name="AddInt")] int

WCF学习笔记 -- 基本概念

WCF是实现WebService的一种微软提出的技术,整合了.Remote, .NET及ASP.NET服务的一种框架.是Windows Communication Foundation的缩写.WebService就是分布式应用程序间实现互操作性的一种标准.它与语言和平台无关,你可以使用任务语言编写发布到任何平台.它在底层通过SOAP协议来传送数据. WebService必须包含的几个要素: Address – 地址,也就是在哪找到该服务.地址必须唯一. Binging – 绑定协议,即通过什么方

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------