浅谈消息队列 Message Queue
消息队列:在消息传递的过程中暂时保存消息的容器,充当发送者和接受者的中间人
消息队列的基本操作
using System;
using System.Messaging; namespace MQ
{
class MQHelper
{
/// <summary>
/// 创建一个消息队列
/// </summary>
/// <param name="name">消息队列的名称</param>
/// <returns>是否创建成功</returns>
public static bool CreateNewMQ(string name)
{
if (!MessageQueue.Exists(".\\private$\\" + name))
{ MessageQueue mq = MessageQueue.Create(".\\private$\\" + name);
mq.Label = "private$\\" + name;
return true;
}
else
{
return false;
}
}
/// <summary>
/// 删除一个消息队列
/// </summary>
/// <param name="name">消息队列的名称</param>
/// <returns>是否创建成功</returns>
public static bool DeleteNewMQ(string name)
{
if (!MessageQueue.Exists(".\\private$\\" + name))
{
MessageQueue.Delete(".\\private$\\" + name);
return true;
}
else
{
return false;
}
}
/// <summary>
/// 发送消息到指定消息队列
/// </summary>
/// <param name="mq_name">消息队列名称</param>
/// <param name="msg_lable">消息头</param>
/// <param name="msg_body">消息体</param>
public static void SendMessage(string mq_name, string msg_lable, string msg_body)
{
MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
Message message = new Message();
message.Label = msg_lable;
message.Body = msg_body;
mq.Send(message);
}
/// <summary>
/// 从指定消息队列获取第一条消息
/// </summary>
/// <param name="mq_name">消息队列名称</param>
/// <returns>Message</returns>
public static Message ReceiveMessage(string mq_name)
{
MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
if (mq.GetAllMessages().Length > 0)
{
Message message = mq.Receive();
if (message != null)
{
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
}
return message;
}
else
{
return null;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Messaging;
//添加物理文件 System.Messaging 的引用
namespace testweb
{
public partial class MSMQtest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//CreateNewQueue("MsgQueue");//创建一个消息队列
//sendSimpleMsg();//每一个队列最好只发送和接收同一种格式的信息,不然不好转换格式。
//receiveSimpleMsg();//
//receiveSimpleMsg();
//sendComplexMsg();
//receiveComplexMsg();
MsgModel m = receiveComplexMsg<MsgModel>();
Response.Write(m.ToString()); }
private void sendSimpleMsg()
{
//实例化MessageQueue,并指向现有的一个名称为VideoQueue队列
MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
//MQ.Send("消息测试", "测试消息");
System.Messaging.Message message = new System.Messaging.Message();
message.Label = "消息lable";
message.Body = "消息body";
MQ.Send(message); Response.Write("成功发送消息," + DateTime.Now + "<br/>");
}
private void receiveSimpleMsg()
{
MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
//调用MessageQueue的Receive方法接收消息
if (MQ.GetAllMessages().Length > 0)
{
System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
if (message != null)
{
//message.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "Message.Bussiness.VideoPath,Message" });//消息类型转换
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, message.Body.ToString(), DateTime.Now));
}
}
else
{
Response.Write("没有消息了!<br/>");
}
}
private void sendComplexMsg()
{
//实例化MessageQueue,并指向现有的一个名称为VideoQueue队列
MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
//MQ.Send("消息测试", "测试消息");
System.Messaging.Message message = new System.Messaging.Message();
message.Label = "复杂消息lable";
message.Body = new MsgModel("1", "消息1");
MQ.Send(message); Response.Write("成功发送消息,"+DateTime.Now+"<br/>");
}
private void receiveComplexMsg()
{
MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
//调用MessageQueue的Receive方法接收消息
if (MQ.GetAllMessages().Length > 0)
{
System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
if (message != null)
{
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(MsgModel) });//消息类型转换
MsgModel msg = (MsgModel)message.Body;
Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, msg, DateTime.Now));
}
}
else
{
Response.Write("没有消息了!<br/>");
}
}
private T receiveComplexMsg<T>()
{
MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");
//调用MessageQueue的Receive方法接收消息
if (MQ.GetAllMessages().Length > 0)
{
System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));
if (message != null)
{
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(T) });//消息类型转换
T msg = (T)message.Body;
return msg;
}
} return default(T);
} /// <summary>
/// 创建消息队列
/// </summary>
/// <param name="name">消息队列名称</param>
/// <returns></returns>
public void CreateNewQueue(string name)
{
if (!System.Messaging.MessageQueue.Exists(".\\private$\\" + name))//检查是否已经存在同名的消息队列
{ System.Messaging.MessageQueue mq = System.Messaging.MessageQueue.Create(".\\private$\\" + name);
mq.Label = "private$\\"+name;
Response.Write("创建成功!<br/>");
}
else
{
//System.Messaging.MessageQueue.Delete(".\\private$\\" + name);//删除一个消息队列
Response.Write("已经存在<br/>");
}
} }
[Serializable]
public class MsgModel
{
public string id { get; set; }
public string Name { get; set; }
public MsgModel() { }
public MsgModel(string _id, string _Name)
{
id = _id;
Name = _Name;
}
public override string ToString()
{
if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(Name)) return "";
return string.Format("id--{0},Name--{1}",id,Name);
}
}
}
浅谈消息队列 Message Queue的更多相关文章
- rabbitMQ消息队列 – Message方法解析
消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...
- Linux:进程通信之消息队列Message实例
/*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h&g ...
- day43-python消息队列二-queue模块
Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...
- 1.消息队列(queue)
版权声明:本文为博主原创文章,未经博主允许不得转载.https://www.cnblogs.com/Dana-gx/p/9724545.html 一.基本概念 IPC:Linux下的进程通信.包括6种 ...
- 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用
目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...
- 浅谈 Event loop (事件循环)
从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...
- C# 消息队列
阅读目录 1. 消息队列是什么? 2. 常见的消息队列框架有哪些? 3. MSMQ介绍 4. RabbitMQ介绍 消息队列是什么 简单的理解就是将消息添加一个队列中,使用时在从这个队列中取出来.那么 ...
- PHP的轻量消息队列php-resque使用说明
日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要 ...
- 【转】MSMQ 微软消息队列 简单 示例
MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...
随机推荐
- 新版 Ubuntu 中 gnome-terminal 可恶的行间距问题逼我退回了 Ubuntu 20.04
不知道从什么时候起(可能是 Ubuntu 21.04,也可能是 Ubuntu 21.10),Ubuntu 中的 gnome-terminal 的行间距就加大了,看起来极其不爽,特别是和 Powerli ...
- 管理 MongoDB 用户和权限
创建用户 创建用户的函数是:db.createUser(). 创建用户时,需要为该用户添加权限.可添加的权限以及说明: 权限 作用 read 允许用户读取指定数据库. readWrite 允许用户读写 ...
- 【NOI P模拟赛】寻找道路(bfs,最短路)
题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- KingbaseES 创建只读(read_only)用户
数据库版本: prod=> select version(); version --------------------------------------------------------- ...
- 如何在 Jenkins CI/CD 流水线中保护密钥?
CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...
- 如何在JavaScript中使用高阶函数
将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...
- 【学习笔记】 第04章 NumPy基础:数组和矢量计算
前言 正式开始学习Numpy,参考用书是<用Python进行数据清洗>,计划本周五之前把本书读完,关键代码全部实现一遍 NumPy基础:数组和矢量计算 按照书中所示,要搞明白具体的性能差距 ...
- MongoDB 的用户和角色权限
副本和分片集群的安全设置参考这个:高级:https://files.cnblogs.com/files/sanduzxcvbnm/mongodb_advance.pdf 默认情况下,MongoDB实例 ...
- mapboxgl加载tiff
缘起 近期在项目中遇到这么一个需求,需要在地图上展示一组格网数据,格网大小为2m*2m,地图api用的mapboxgl.起初拿到这个需要感觉很easy,在地图上添加一个fill图层就好啦.把格网面数据 ...