消息队列:在消息传递的过程中暂时保存消息的容器,充当发送者和接受者的中间人

消息队列的基本操作

  1. using System;
  2. using System.Messaging;
  3.  
  4. namespace MQ
  5. {
  6. class MQHelper
  7. {
  8. /// <summary>
  9. /// 创建一个消息队列
  10. /// </summary>
  11. /// <param name="name">消息队列的名称</param>
  12. /// <returns>是否创建成功</returns>
  13. public static bool CreateNewMQ(string name)
  14. {
  15. if (!MessageQueue.Exists(".\\private$\\" + name))
  16. {
  17.  
  18. MessageQueue mq = MessageQueue.Create(".\\private$\\" + name);
  19. mq.Label = "private$\\" + name;
  20. return true;
  21. }
  22. else
  23. {
  24. return false;
  25. }
  26. }
  27. /// <summary>
  28. /// 删除一个消息队列
  29. /// </summary>
  30. /// <param name="name">消息队列的名称</param>
  31. /// <returns>是否创建成功</returns>
  32. public static bool DeleteNewMQ(string name)
  33. {
  34. if (!MessageQueue.Exists(".\\private$\\" + name))
  35. {
  36. MessageQueue.Delete(".\\private$\\" + name);
  37. return true;
  38. }
  39. else
  40. {
  41. return false;
  42. }
  43. }
  44. /// <summary>
  45. /// 发送消息到指定消息队列
  46. /// </summary>
  47. /// <param name="mq_name">消息队列名称</param>
  48. /// <param name="msg_lable">消息头</param>
  49. /// <param name="msg_body">消息体</param>
  50. public static void SendMessage(string mq_name, string msg_lable, string msg_body)
  51. {
  52. MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
  53. Message message = new Message();
  54. message.Label = msg_lable;
  55. message.Body = msg_body;
  56. mq.Send(message);
  57. }
  58. /// <summary>
  59. /// 从指定消息队列获取第一条消息
  60. /// </summary>
  61. /// <param name="mq_name">消息队列名称</param>
  62. /// <returns>Message</returns>
  63. public static Message ReceiveMessage(string mq_name)
  64. {
  65. MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
  66. if (mq.GetAllMessages().Length > 0)
  67. {
  68. Message message = mq.Receive();
  69. if (message != null)
  70. {
  71. message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
  72. }
  73. return message;
  74. }
  75. else
  76. {
  77. return null;
  78. }
  79. }
  80. }
  81. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Messaging;
  8. //添加物理文件 System.Messaging 的引用
  9. namespace testweb
  10. {
  11. public partial class MSMQtest : System.Web.UI.Page
  12. {
  13. protected void Page_Load(object sender, EventArgs e)
  14. {
  15. //CreateNewQueue("MsgQueue");//创建一个消息队列
  16. //sendSimpleMsg();//每一个队列最好只发送和接收同一种格式的信息,不然不好转换格式。
  17. //receiveSimpleMsg();//
  18. //receiveSimpleMsg();
  19. //sendComplexMsg();
  20. //receiveComplexMsg();
  21. MsgModel m = receiveComplexMsg<MsgModel>();
  22. Response.Write(m.ToString());
  23.  
  24. }
  25. private void sendSimpleMsg()
  26. {
  27. //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列
  28. MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
  29. //MQ.Send("消息测试", "测试消息");
  30. System.Messaging.Message message = new System.Messaging.Message();
  31. message.Label = "消息lable";
  32. message.Body = "消息body";
  33. MQ.Send(message);
  34.  
  35. Response.Write("成功发送消息," + DateTime.Now + "<br/>");
  36. }
  37. private void receiveSimpleMsg()
  38. {
  39. MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
  40. //调用MessageQueue的Receive方法接收消息
  41. if (MQ.GetAllMessages().Length > 0)
  42. {
  43. System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
  44. if (message != null)
  45. {
  46. //message.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "Message.Bussiness.VideoPath,Message" });//消息类型转换
  47. message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
  48. Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, message.Body.ToString(), DateTime.Now));
  49. }
  50. }
  51. else
  52. {
  53. Response.Write("没有消息了!<br/>");
  54. }
  55. }
  56. private void sendComplexMsg()
  57. {
  58. //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列
  59. MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
  60. //MQ.Send("消息测试", "测试消息");
  61. System.Messaging.Message message = new System.Messaging.Message();
  62. message.Label = "复杂消息lable";
  63. message.Body = new MsgModel("1", "消息1");
  64. MQ.Send(message);
  65.  
  66. Response.Write("成功发送消息,"+DateTime.Now+"<br/>");
  67. }
  68. private void receiveComplexMsg()
  69. {
  70. MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
  71. //调用MessageQueue的Receive方法接收消息
  72. if (MQ.GetAllMessages().Length > 0)
  73. {
  74. System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
  75. if (message != null)
  76. {
  77. message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(MsgModel) });//消息类型转换
  78. MsgModel msg = (MsgModel)message.Body;
  79. Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, msg, DateTime.Now));
  80. }
  81. }
  82. else
  83. {
  84. Response.Write("没有消息了!<br/>");
  85. }
  86. }
  87. private T receiveComplexMsg<T>()
  88. {
  89. MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
  90. //调用MessageQueue的Receive方法接收消息
  91. if (MQ.GetAllMessages().Length > 0)
  92. {
  93. System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
  94. if (message != null)
  95. {
  96. message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(T) });//消息类型转换
  97. T msg = (T)message.Body;
  98. return msg;
  99. }
  100. }
  101.  
  102. return default(T);
  103. }
  104.  
  105. /// <summary>
  106. /// 创建消息队列
  107. /// </summary>
  108. /// <param name="name">消息队列名称</param>
  109. /// <returns></returns>
  110. public void CreateNewQueue(string name)
  111. {
  112. if (!System.Messaging.MessageQueue.Exists(".\\private$\\" + name))//检查是否已经存在同名的消息队列
  113. {
  114.  
  115. System.Messaging.MessageQueue mq = System.Messaging.MessageQueue.Create(".\\private$\\" + name);
  116. mq.Label = "private$\\"+name;
  117. Response.Write("创建成功!<br/>");
  118. }
  119. else
  120. {
  121. //System.Messaging.MessageQueue.Delete(".\\private$\\" + name);//删除一个消息队列
  122. Response.Write("已经存在<br/>");
  123. }
  124. }
  125.  
  126. }
  127. [Serializable]
  128. public class MsgModel
  129. {
  130. public string id { get; set; }
  131. public string Name { get; set; }
  132. public MsgModel() { }
  133. public MsgModel(string _id, string _Name)
  134. {
  135. id = _id;
  136. Name = _Name;
  137. }
  138. public override string ToString()
  139. {
  140. if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(Name)) return "";
  141. return string.Format("id--{0},Name--{1}",id,Name);
  142. }
  143. }
  144. }

浅谈消息队列 Message Queue的更多相关文章

  1. rabbitMQ消息队列 – Message方法解析

    消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...

  2. Linux:进程通信之消息队列Message实例

    /*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h&g ...

  3. day43-python消息队列二-queue模块

    Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...

  4. 1.消息队列(queue)

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://www.cnblogs.com/Dana-gx/p/9724545.html 一.基本概念 IPC:Linux下的进程通信.包括6种 ...

  5. 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

    目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...

  6. 浅谈 Event loop (事件循环)

    从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...

  7. C# 消息队列

    阅读目录 1. 消息队列是什么? 2. 常见的消息队列框架有哪些? 3. MSMQ介绍 4. RabbitMQ介绍 消息队列是什么 简单的理解就是将消息添加一个队列中,使用时在从这个队列中取出来.那么 ...

  8. PHP的轻量消息队列php-resque使用说明

    日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要 ...

  9. 【转】MSMQ 微软消息队列 简单 示例

    MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...

随机推荐

  1. 论文翻译:2021_A New Real-Time Noise Suppression Algorithm for Far-Field Speech Communication Based on Recurrent Neural Network

    论文地址:一种新的基于循环神经网络的远场语音通信实时噪声抑制算法 引用格式:Chen B, Zhou Y, Ma Y, et al. A New Real-Time Noise Suppression ...

  2. [CF1500E] Subset Trick (平衡树)

    题面 洛谷翻译 V a n y a \rm Vanya Vanya 有一个初始大小为 n n n 的集合 S S S 和 q q q 次往集合加数/删数的操作.(集合中每个数字不同) 称一个数 x x ...

  3. 【java】学习路径38-数学模型分析:不同方式复制文件所需的时间

    测试文件:一段72kb的文本.约5.6MB大小的pdf论文.约38.9MB大小的无损音频文件. demo001 论<到灯塔去>的凝视主题.pdf irreplaceable.movpkg ...

  4. javaweb-thymeleaf,加载jar包---视图基础

    1.加载完thymeleaf的jar包 将thymeleaf的jar包复制到项目下lib文件夹中 右击lib文件夹,点击Add as librarb... 打开Project Structure,找到 ...

  5. 简单的java代码审计

    描述 很简单的代码审计 java安全--Fastjson反序列化 java安全--SQL注入 Fastjson 反序列化 首先看一下配置文件,对于Maven项目,我们首先从pom.xml文件开始审计引 ...

  6. Typora多线程批量上传图片,永久免费25G图床

    为了满足日常需求,就写了一个自动上传图片到图床的脚本 运行该程序可以做到自动完成图片上传,并自动替换为网络链接,支持多图同时上传,采用了多线程,上传速度提升很明显. 以Window系统为例,操作步骤: ...

  7. WinUI(WASDK)项目实践——优雅的开发上位机应用(新)

    摘要 这就是一个记录自己进行WinUI项目实践的博客,项目开源地址如下,觉得有帮助的可以去看看,因为项目都开源了,所以保姆级的讲解肯定不如直接看代码来的实在了. 电子脑壳项目地址 为什么叫新 因为之前 ...

  8. 如何在 Jenkins CI/CD 流水线中保护密钥?

    CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  10. 高德地图与CAD图叠加显示方法汇总及优缺点分析

    前言 ​ 高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能.如高德影像地图应用在包括地理.土地测量.水文学.生态学.气象学以及海洋学等方面.Auto ...