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、创建
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学习笔记的更多相关文章
- MSMQ学习笔记一——概述
一.MSMQ是什么 Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为M ...
- MSMQ学习笔记二——创建Message Queue队列
一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队 ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- Spring.NET学习笔记——目录(原)
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- 一 手游开发工具cocos2d-x editor初识
可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...
- cocos2dx手写js绑定C++
这两天连续查阅了js绑定c++的非常多文章 , 有手动与自己主动两种方式 . 本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 . 以下总结一下手动绑定的实现过程 : 一共三步 ...
- UML之部署图(Deployment Diagram)
计算机系统由硬件和软件组成,应用软件的命令,先转化为操作系统命令,再转化为汇编语言,最后再转化为二进制命令,由硬件来运行.软件要部署到硬件上才具有生命.Deployment Diagram展示的就是把 ...
- Oracle SQL Lesson (1) - 使用SQL Select语句获取数据
第一节课: 启动数据库并且使用特定用户连接:su - oracle; 启动sqlplus并且使用sys连接:conn / as sysdba; 启动数据库:startup; 解锁用户:alter us ...
- jquery实现仿select列表的即时搜索及拼音搜索
这里提到select,其实不是select,而是用<li><input>标签去仿造一个select,以实现对已有“option”的快速检索功能. 以<input>标 ...
- Ubuntu Linux 永山(mount)分
在一般情况下,我们想安装一个分区解决方案是使用mount命令,因为我想/dev/sda3安装/media/aborn/data通过使用下面的命令 sudo mount /dev/sda3 /media ...
- VC6 鼠标钩子 最简单样例
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...
- crontab,想说爱你不easy
悲剧的背景 跑自己主动化脚本的机器连不上toastserver了, 仅仅能自己写个脚本每天跑了. 当然要放在crontab里了. 5 3 * * * sh ~/nosecron.sh 更悲剧的结果 第 ...
- 我的学习笔记_Windows_HOOK计划 2009-12-03 11:19
一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...
- 【Android进阶】让程序运行效率更高的编程技巧总结
1.在程序中若出现字符串连接的情况,请使用StringBuffer代替String,这样可以减少多次创建String以及垃圾回收所带来的内存消耗 2.尽量使用局部变量.调用方法时传递的参数以及调用中创 ...