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

QueueService srv = QueueService.Instance();//检查存储DTO1的队列是否存在,如不存在则自动建立
srv.Prepare<DTO1>();//发送类型为DTO1的消息
srv.Send<DTO1>(new DTO1() {  p1="1",  p2="2" });//发送类型为DTO1的消息,并且将发送的消息Id保存到msgId变量中
string msgId=srv.Send<DTO1>(new DTO1() { p1 = "1", p2 = "2" });//接收末尾消息
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;}}}

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

转载于:https://www.cnblogs.com/aarond/p/QueueService.html

消息队列工具类(MSMQ)相关推荐

  1. java企业微信消息发送工具类

    java企业微信消息发送工具类 用途 基于java实现调用企业微信发送消息,文件,图片. 实现效果 文件列表 文件名 用途 WechatUtil.java 企业微信工具类 WechatTest.jav ...

  2. 微信小程序加密消息解密工具类

    开发者后台校验与解密开放数据 微信会对这些开放数据做签名和加密处理.开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改. 签名校验以及数据加解密涉及用户的会话密钥 session ...

  3. 响应其他应用程序的系统菜单消息 insertmenu_「DDD」跟我一起学WCF(1)——MSMQ消息队列...

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

  4. C# 模拟一个处理消息队列的线程类 Message Queue

    1 // 模拟一个处理消息队列的类 2 class MessageHandler 3 { 4 // 消息队列 5 private Queue<string> messageQue = ne ...

  5. Microsoft Message Queue(MSMQ:微软消息队列)简介

    一.前言 最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速.直观的认识.本文针对于Microsoft Message Queue,以下提到的消息队 ...

  6. .NET为什么推荐它作为RabbitMQ消息队列的首选开发工具

    [前言] 自2022年末推出此工具以来,相关文章已被圈内顶尖的几家.NET头条号转载,而且短短数月,已有超100个团队/个人开发者使用它来操控RabbitMQ消息队列,反响可谓十分火爆.故本次经典重现 ...

  7. 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!

    作者:kosamino cnblogs.com/jing99/p/11679426.html 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. 运用消息队列之后,用户下单完 ...

  8. RabbitMQ(消息队列)浅记

    消息队列 PS:大二下学习RabbitMQ的随手小记 一.什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而 ...

  9. [阶段4 企业开发进阶] 3. 消息队列--RabbitMQ

    文章目录 1 消息队列 1.1 MQ的概念 基本介绍 使用原因 MQ分类 如何选择 1.2 RabbitMQ RabbitMQ核心 工作原理 安装教程 2 Hello World 2.1 依赖 2.2 ...

最新文章

  1. RDKit | 比较化合物并通过PCA可视化化学空间
  2. linux 报错 ip_conntrack version 2.4 (8192 buckets, 65536 max) - 304 bytes per conntrack 解决方法
  3. Eclipse导入项目:No projects are found to import
  4. UE4学习-自定义相机视图
  5. 阿里《Java开发手册》最新嵩山版发布!
  6. 训练日志 2018.10.31
  7. 喜欢去知乎炸鱼?用python吧
  8. NUnit.Framework在VS2015中如何进行单元测试
  9. boot客户管理系统源码_「计算机毕设」基于SpringBoot开发的仓库管理系统
  10. 2021,自动驾驶的“五代十国”
  11. Xcode7-“App Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  12. Zigbee通讯之开发篇(基于TI 的Z-Stack)
  13. java红宝石是哪本_以月/年红宝石显示帖子
  14. mysql中char是什么意思_mysql中char与varchar的区别
  15. 使用7z压缩工具批量压缩文件
  16. C++入门到精通。(五、C++的运算符。)
  17. java格式化XML文件
  18. 论文写作——如图所示
  19. 探究斐波那契数列的通项公式
  20. Python 随机数的产生

热门文章

  1. android 观察者的框架,Android 架构师7 设计模式之观察者模式
  2. pdo mysql 建库_一帖让PHP小白彻底了解PDO操作数据库的方法
  3. 计算机应用基础课程没有期末考试,《计算机应用基础》课程期末考试2009—2010学年第一学期.doc...
  4. vs2019键盘钩子_C#键盘按键监视
  5. 002_Container布局容器
  6. java多线程构造函数_Java多线程编程经验谈
  7. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  8. kaggle房价预测特征意思_R语言实战:复杂数据处理和分析之Kaggle房价预测
  9. 产品经理入门——PM
  10. python堆排序求topn_堆排序和topN算法