所要做的是简化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. python base64 decode incorrect padding错误解决方法

    个人觉得原因应该是不同的语言/base64库编码规则不太统一的问题. python中base64串的长度需为4的整数倍,故对长度不为4整数倍的base64串需要用"='补足 如下代码: da ...

  2. html之head标签

    本文内容: head标签 介绍 常用子标签 meta title link style script 首发时间:2018-02-12 修改: 2018-04-24:修改了标题名称,重新排版了内容,使得 ...

  3. MySQL 约束、表连接、表关联、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性. 外键:是另一表的唯一性 ...

  4. python 交互式命令行数据库连接助手 -- mysql、sql server (mssql)、redis

    目录 python 交互式命令行数据库连接助手 0. 操作示例 1. python 连接mssql 2. python 连接mysql 3. python 连接redis n. Tips python ...

  5. ASP.NET系统对象

    一.ASP.NET 系统对象        Request:用来获取客户端在Web请求期间发送的值,如URL参数,表单参数        Response:用来负者返回到客户端的HTTP输出      ...

  6. visual studio 启动无法打开IIS express

    删除 解决方案下的vs文件夹之后重新生成

  7. Python 输出格式符号

    Python 常见的输出格式符号

  8. Ubuntu下永久修改主机名和创建用户

    使用hostname 进行修改. 创建用户,修改密码

  9. 下载Eclipse、下载Java各个版本,来这里就对了

    Eclipse官网:http://www.eclipse.org/ 不信你去看看 Java官网:https://www.java.com/ 不信你去看看 可惜是,每次进入官网提示都是下面这样的:来,我 ...

  10. 一个好看的php验证码源码

    <?php     $w = 80; //设置图片宽和高 $h = 26; $str = Array(); //用来存储随机码 $string = "ABCDEFGHIJKLMNOPQ ...