这几天学习了一下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、创建

  MessageQueue messageQueue = null;
string path = @".\private$\Message\";
/// <summary>
/// 打开对应的Msmq
/// </summary>
/// <param name="path">msmq路径</param>
/// <param name="transactional">是否为事务</param>
public void OpenMq(string path,bool transactional)
{ if (MessageQueue.Exists(path))
{
messageQueue = new MessageQueue(path);//注意已经存在该路径的msmq,其事务性是不可修改的
}
else
{
messageQueue = MessageQueue.Create(path,transactional);
} }

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)非事务同步读取

        /// <summary>
/// 读取消息并删除
/// </summary>
/// <returns></returns>
public Message Receive()
{
messageQueue.Formatter = new BinaryMessageFormatter();
try
{
return messageQueue.Receive(new TimeSpan(, , ));
}
catch (Exception ex)
{
throw;
// return new Message(ex.Message);
}
}

2)异步的读取(略)

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

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

 

MSMQ学习笔记的更多相关文章

  1. MSMQ学习笔记一——概述

    一.MSMQ是什么 Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为M ...

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

    一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队 ...

  3. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  4. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  5. Spring.NET学习笔记——目录(原)

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. H3C低端交换机MAC绑定

    1.MAC地址和端口的绑定<h3c>system[h3c]interface e0/1[h3c-interface]mac-address max-count #关闭交换机端口的MAC学习 ...

  2. 淘宝分布式 key/value 存储引擎Tair安装部署过程及Javaclient測试一例

    文件夹 1. 简单介绍 2. 安装步骤及问题小记 3. 部署配置 4. Javaclient測试 5. 參考资料 声明 1. 以下的安装部署基于Linux系统环境:centos 6(64位),其他Li ...

  3. WPF疑难杂症会诊

    原文:WPF疑难杂症会诊 为什么图片像素是模糊的? 容器边框设为非整数时,其内容中的像素图片会产生模糊,即使设置SnapsToDevicePixels="True"也无效. 以下是 ...

  4. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

  5. Hibernate主键生成策略简单总结

    数据库表主键的知识点: Generator 为每个 POJO 的实例提供唯一标识. 一般情况,我们使用"native".class 表示采用由生成器接口net.sf.hiberna ...

  6. The JSR-133 Cookbook for Compiler Writers(an unofficial guide to implementing the new JMM)

    The JSR-133 Cookbook for Compiler Writers by Doug Lea, with help from members of the JMM mailing lis ...

  7. ASM时的OFM特性对影的建数据文件名称的影响及为SYSTEM表空间的数据文件使用别名

    客户遇到个DG的问题,存储使用的ASM管理,有多个磁盘盘. 在主库创建数据文件,备库自己主动创建的数据文件都在同一磁盘组,而且在主库创建数据文件是指定的是类似**.DBF的名字,到备库也变成了使用AS ...

  8. datagrid标题头粗体

    //标题头粗体        //$("#R_datagrid .datagrid-header-row td div span").each(function (i, th) { ...

  9. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  10. as3文本框的动态拖拽和编辑

    如今非常多软件都支持了编辑界面的文本拖拽和点击编辑来直接改动数值, 这样便于操作, 并且体验性也好, 抛砖引玉吧 于是就用好久没编写的as3来写了一下: 由于用的flash ide写的没有提示, 就临 ...