所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示:

QueueService srv = QueueService.Instance();

//检查存储DTO1的队列是否存在,如不存在则自动建立
srv.Prepare<DTO1>(); //发送类型为DTO1的消息
srv.Send<DTO1>(new DTO1() { p1="", p2="" }); //发送类型为DTO1的消息,并且将发送的消息Id保存到msgId变量中
string msgId=srv.Send<DTO1>(new DTO1() { p1 = "", p2 = "" }); //接收末尾消息
DTO1 msg = srv.Receive<DTO1>(); //接收末尾消息,并且将这个消息Id保存在msgId变量中
DTO1 msg = srv.Receive<DTO1>(ref msgId); //发送回复消息,并且指定这个回复消息是特定消息ID所专有的回复消息
srv.SendResponse<DTO1>(msg, msgId); //接收特定消息ID的回复消息
msg=srv.ReceiveResponse<DTO1>(msgId);

主要的地方有2个:

  • msmq消息大小限制的突破(4M突破)
  • 泛型T对象的序列化、反序列化

突破大小限制

  • 如果大小在4M内,则直接msmq封装(MessageLocation=InQueue)
  • 如果在4M外,则通过网络共享文件来封装(MessageLocation=InNetwork)

泛型T对象的序列化、反序列化

  • 固定住所要传递的对象类型为MessageWrapper
  • 在MessageWrapper内部嵌入用户想要传递的其他对象以及相应的type、module名,这样MessageWrapper就能进行自动xml化以及反xml化了

MessageWrapper代码如下:

public class MessageWrapper
{
private ShareFileBroker fileBroker;
public MessageWrapper()
{
PersistenceType = MessageLocation.InQueue;
fileBroker = new ShareFileBroker(FileService.FileService.Instance());
} public string RealObjectType { get; set; }
public string RealObjectModule { get; set; }
public string RealObjectXml { get; set; }
public string NetworkLocation { get; set; }
public MessageLocation PersistenceType { get; set; } public void Inject<T>(T obj)
{
this.RealObjectType = typeof(T).FullName;
this.RealObjectModule = typeof(T).Module.Name;
string xml = SerializeUtils.Serialize2XML(typeof(T), obj);
SaveXML(xml);
}
public T Extract<T>()
{
Assembly assembly = AppDomain.CurrentDomain.Load(this.RealObjectModule.TrimEnd(".dll".ToCharArray()));
Type type = assembly.GetType(this.RealObjectType);
string xml = GetXML();
return (T)SerializeUtils.DeserializeFromXML(type, xml);
} private string GetXML()
{
string xml = "";
if (this.PersistenceType == MessageLocation.InQueue)
xml = this.RealObjectXml;
else if (this.PersistenceType == MessageLocation.InNetwork)
xml = fileBroker.GetContentAndDelete(this.NetworkLocation);
return xml;
}
private void SaveXML(string xml)
{
if (xml.Length > QueueConfiguration.QueueConfiguration.MaxQueueBodyLength)
{
this.NetworkLocation = fileBroker.Save(xml);
this.PersistenceType = MessageLocation.InNetwork;
}
else
{
this.RealObjectXml = xml;
this.PersistenceType = MessageLocation.InQueue;
}
}
}

代码比较简单,就不介绍了。

消息队列工具类(MSMQ)的更多相关文章

  1. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  2. 基于数组阻塞队列 ArrayBlockingQueue 的一个队列工具类

    java语言基于ArrayBlockingQueue 开发的一个根据特定前缀和后缀的队列.每天自动循环生成. 1.定义队列基类 Cookie package com.bytter.util.queue ...

  3. RabbitMQ消息队列帮助类

    调用 //消息队列发消息 MqConfigInfo config = new MqConfigInfo(); config.MQExChange = "DrawingOutput" ...

  4. 消息队列数量统计(MSMQ,Performance Counter)

    微软消息队列服务MSMQ (Microsoft Message Queue),工作在在线或者离线场景,并提供异步编程功能.互联网和企业开发很多场景应用,例如电商的订单处理流程,这是因为客户端不需要等待 ...

  5. Beanstalkd消息队列 -- php类Pheanstalk使用

    业务场景 商城订单生成30分钟后 如果未支付关闭订单 解决办法 可以使用延迟消息队列   这里我们用的是beanstalkd Beanstalkd介绍 Beanstalk,一个高性能.轻量级的分布式内 ...

  6. Java队列工具类(程序仅供练习)

    public class QueueUtils<T> { public int defaultSize; public Object[] data; public int front = ...

  7. WCF之MSMQ消息队列

    一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具. MSMQ与XML Web Services和.Net ...

  8. 跟我一起学WCF(1)——MSMQ消息队列

    一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...

  9. C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)

    前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,就可以执行余下的代 ...

随机推荐

  1. 操作系统-进程通信(信号量、匿名管道、命名管道、Socket)

    进程通信(信号量.匿名管道.命名管道.Socket) 具体的概念就没必要说了,参考以下链接. 信号量 匿名管道 命名管道 Socket Source Code: 1. 信号量(生产者消费者问题) #i ...

  2. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  3. 章节七、1-ArrayList

    一.集合是一个容器,前面讲的数值也是一个容器, 它们的区别是: 1.数组既可以存储基本数据类型,又可以存储引用数据类型,而集合只能存储引用数据类型,也就是对象. 2.基本数据类型存储的是值,引用数据类 ...

  4. mysql练习----The JOIN operation

    game id mdate stadium team1 team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 June 2012 ...

  5. 安全之路 —— 使用Windows全局钩子打造键盘记录器

    简介 键盘记录功能一直是木马等恶意软件窥探用户隐私的标配,那么这个功能是怎么实现的呢?在Ring3级下,微软就为我们内置了一个Hook窗口消息的API,也就是SetWindowsHookEx函数,这个 ...

  6. Window快捷键

    1.带windows 键 Win + E 打开文件夹 Win + R 调出运行命令 Win + T 显示任务栏,并在在其中切换 Win +Pause 显示系统属性 Win + Home 最小化 / 还 ...

  7. XSS 漏洞原理及防御方法

    XSS跨站脚本攻击:两种情况.一种通过外部输入然后直接在浏览器端触发,即反射型XSS:还有一种则是先把利用代码保存在数据库或文件中,当web程序读取利用代码并输出在页面上时触发漏洞,即存储型XSS.D ...

  8. C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者

    投票系统:给定候选人名单,从键盘输入候选人的名字,统计票数,并输出最终获胜者.若投票人输入的名字不在其候选名单上,则该票数无效. //凯鲁嘎吉 - 博客园 http://www.cnblogs.com ...

  9. npm方法

    1. 使用npm 下载全局包 npm install 包名字 -g 安装 npm uninstall 包名字 -g 卸载 2. 安装卸载本地的包 (在哪里执行命令就把包安装在哪个目录的node_mod ...

  10. 你可能不知道的printf

    前言 printf可能是我们在学习C语言的过程中最早接触的库函数了.其基本使用想必我们都已经非常清楚了.但是下面的这些情况你是否已经清楚地知道了呢? 示例程序 我们来看一个示例程序,看看你能否对下面的 ...