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 ...
随机推荐
- 基于FFMPEG和SDL实现视频播放器
这个是雷大牛实现的project. http://download.csdn.net/detail/leixiaohua1020/5122959 有兴趣的能够好好研究研究.
- 【Android Training - UserInfo】记住登入用户的信息[Lesson 1 - 使用AccountManager来记住用户]
Remembering Your User[记住你的用户] 每一个人都非常喜欢自己的名字能被人记住.当中最简单,最有效的使得你的app让人喜欢的方法是记住你的用户是谁,特别是当用户升级到一台新的设备或 ...
- codeforece Round#311 BCDE
B题 给我们n,m , m表示茶壶的容量 接下来2*n个数字,表示茶杯的容量,将这些茶杯分给n个男孩和n个女孩 可以倒x毫升的茶水给每个女孩,那么就要倒2x毫升的茶水给男孩,当然了,茶杯要装的下,且 ...
- 详细分析Java中断机制(转)
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
- servlet 实现下载文件
servlet: public class UpAndDownServlet extends HttpServlet { public void doPost(HttpServletRequest r ...
- LDAPserver的安装
源代码安装,以root用户进行 由于:由于openldap须要用Berkeley DB来存放数据,所以要先安装所以需先安装Berkeley DB 4.2.52数据库. 一 安装Berkeley DB ...
- 认为C/C++很难理解、找工作面试笔试,快看看这本书!
假设你是C/C++谁刚开始学习,看这本书.因为也许你读其他的书还不如不看.一定要选择一本好书. 假设你正在准备工作,请认真看这本书,由于这本书会教会你工作中必备的知识,相信你即将面临的语法类题目不会超 ...
- google多语言通信框架gRPC
google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...
- WPF对于xml的简单操作(下下)插入节点并排序
正如T所说,下下,这个方法不堪入目, ̄□ ̄|| 贴上再说 //先搞个struct声明 private struct datastruct { public string x; public strin ...
- Oracle SQL Lesson (8) - 使用集合操作符(Union,Intersect,Minus)
集合操作符UNION/UNION ALLINTERSECTMINUS Union All不排序,不去重,其余均升序且去重.create table e1 as select * from emp wh ...