所要做的是简化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. 深入理解Java虚拟机04--类结构文件

    一.程序存储格式 统一的程序存储格式:不同平台的虚拟机于所有平台都统一使用程序存储格式——字节码(ByteCode); Java 虚拟机不关心 Class 文件的来源,而只和“Class文件" ...

  2. tab 切换实现方法

    ul li 实现方法(只适用于,一个页面只有一组ul>li) <!--menu--> <div class="nav"> <ul class=& ...

  3. shell编程—变量(三)

    在shell脚本中,变量分两种,系统变量和自定义变量. 系统默认变量是系统自带的一些变量,如path为路径变量 用户自定义变量为在编写吧脚本的时候自己定义的一些变量 变量名命名规则 首个字符必须为字母 ...

  4. java中利用dom4j解析XML文件

    官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...

  5. Unknown initial character set index '255' received from server. Initial client character set can be

    mysql的连接错误,在网上查找到是编码不匹配的原因, 直接在连接的URL后加上?useUnicode=true&characterEncoding=utf8就可以了

  6. shopkeep/spark Dockerfile示例

    FROM java:openjdk- ENV HADOOP_HOME /opt/spark/hadoop- ENV MESOS_NATIVE_LIBRARY /opt/libmesos-.so ENV ...

  7. 【转】Vue组件一-父组件传值给子组件

    Vue组件一-父组件传值给子组件 开始 Vue组件是学习Vue框架最比较难的部分,而这部分难点我认为可以分为三个部分学习,即 组件的传值 - 父组件向子组件中传值 事件回馈 - 子组件向父组件发送消息 ...

  8. docker实战练习(一)

    systemctl start docker systemctl pause docker systemctl unpause docker systemctl start docker system ...

  9. nginx学习笔记(一)

    select模型主要是apache用   FD 文件描述符   soa架构 安装nginx ping baidu.com netstat -lntup 查看端口 cat /etc/redhat-rel ...

  10. Linux三剑客-AWK

    1.什么是awk AWK是一种处理文本文件的语言,是一个强大的文本分析工具.有统计和计算功能. 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Br ...