所要做的是简化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. Android星球效果实现

    在项目中看着这个旋转效果挺炫的,就抽取出来做个记录.主要是使用CarrouselLayout 稍微修改 CarrouselLayout代码Demo下载z地址:GitHub https://github ...

  2. NoHttp封装--08 用一个实体类接收所有接口数据

    1.用户信息获取--bean实体类形式返回数据 ①服务器端: 代码: protected void onHandler(HttpServletRequest request, HttpServletR ...

  3. tkinter进阶版——ttk

    很长的一段时间里,我都是用tkinter进行GUI设计的,还写过一篇<tkinter模块常用参数>. 但后来慢慢地觉得,这个tkinter真的是有点丑啊. 于是,找到了现在的ttk. tt ...

  4. 如何解决远程连接mysql出现Can’t connect to MySQL server on (111 “Connection refused”)的问题

    如何解决远程连接mysql出现Can’t connect to MySQL server on (111 “Connection refused”)的问题 开放Mysql的远程连接 在服务器上登录my ...

  5. List删除

    使用for循环,倒序删除: ; i >= ; i--) { var item = list[i]; ") { list.Remove(item); } }

  6. python3编写网络爬虫19-app爬取

    一.app爬取 前面都是介绍爬取Web网页的内容,随着移动互联网的发展,越来越多的企业并没有提供Web页面端的服务,而是直接开发了App,更多信息都是通过App展示的 App爬取相比Web端更加容易 ...

  7. go语言中如何模拟100个IP同时并发访问服务器,每个ip要重复访问1000次。每个Ip一分钟之内只能访问一次

    package main import ( "time" "sync" "fmt" "sync/atomic" ) ty ...

  8. Linux之初识磁盘

    磁盘知识体系概括 机械硬盘和固态硬盘 机械磁盘剖开图 磁盘工作的视频动画,主轴转动,机械手读写 模拟磁盘工作视频,点击中间三角播放 磁盘结构详解 磁盘外部结构 组成 主要由三部分组成:盘片.主轴(机械 ...

  9. mysql锁2

    死锁: 指两个事务或者多个事务在同一资源上相互占用,并请求对方所占用的资源,从而造成恶性循环的现象. 出现死锁的原因: 系统资源不足: 进程运行推进的顺序不当: 资源分配不当. 产生死锁的四个必要条件 ...

  10. Linux:Day2 发行版本、命令获取

    Linux的哲学思想: 1.一切皆文件:把几乎所有资源,包括硬件设备都组织为文件格式: 2.由众多单一目的的小程序组成,一个程序只实现一个功能,而且要做好: 组合小程序完成复杂任务: 3.尽量避免跟用 ...