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 ...
随机推荐
- SE 2014年5月8日
两企业接入到 Internet(A公司和B公司),企业内部的用户及服务器均能够访问到 Internet. 2. A公司规模较大,采用了接入层/汇聚层/核心层的划分模式,接入层划分了多vLan(如图), ...
- 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务
原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...
- Eclipse扩展点实践之添加快捷菜单项(Command方式实现)
有两种方式,一种是Action的方式,另一种是Command的方式(这两种方式的区别详见:http://wiki.eclipse.org/FAQ_What_is_the_difference_betw ...
- JAVA取整以及四舍五入
JAVA取整以及四舍五入 import java.math.BigDecimal; //引入这个包 public class Test { public static void main(String ...
- Gradle 修改 Maven 仓库地址(转)
近来迁移了一些项目到Android Studio,采用Gradle构建确实比原来的Ant方便许多.但是编译时下载依赖的网速又着实令人蛋疼不已. 如果能切换到国内的Maven镜像仓库,如开源中国的Mav ...
- H264相关随笔
DR(Instantaneous Decoding Refresh)--即时解码刷新. I和IDR帧都是使用帧内预测的.它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结 在SP2013中,工作流已经从SP Server中脱离 ...
- POJ 3181 Dollar Dayz 简单DP
这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...
- C# webservice初探
转载请注明出处Coder的不平庸:http://blog.csdn.net/pearyangyang/article/details/46348633 因为工作的终端曾经是直接对数据库进行操作,导致每 ...
- ecshop首页调用某分类下的商品|assign_cat_goods()
ecshop首页调用分类下的商品其实很简单,也有模板设置那里可以设置,不过那个只可以用cat_goods.lib,不方便,所以我想看看怎么能简单的实现ecshop首页调用分类下的商品 只需要在inde ...