首页 > 其他分享 >消息队列

消息队列

时间:2023-12-18 17:25:20浏览次数:28  
标签:string MessageQueue 队列 消息 msgPath 读取

首先使用消息队列前,我们需要知道,消息队列是用来发送、接收数据的一个容器,简单的说:我们在某宝上买东西,这中间有一个快递的过程,而大多数情况下,我本人选择将我买的东西寄到某个代收点,派送员只需要按照我的要求将东西放到代收点就可以了,之后我有时间了才自己去取。消息队列就类似于这个代收点了,它能存取数据。那么既然存取数据,那我们总得先知道这玩意在哪里,不能盲目瞎搞。   博主的操作系统是WIN10的,所以此处写WIN10的操作步骤:   打开“此电脑”-->左上角点击“计算机”-->点击“管理”

 

然后进入了计算机管理界面   点击左边的“服务和应用程序”-->“消息队列”。此时会看到三个空的文件夹(如果别的地方操作过的话也有可能不是空的),分别是“传出队列”、“专用队列”和“系统队列”,这三个文件夹就是我们所要的“快递代收点”了。

 

注意:如果没看到“消息队列”这个选项,那就是这东西在这电脑上还没使用过,没关系,一会编程的时候创建就会显示出来了(我印象中一开始我也没有这个选项,写了代码后就有了) 知道这东西在哪里后,开始进入正题。C#中使用消息队列需要添加新的引用System.Messaging

 

添加引用后在代码里添加命名空间就可以开始了

 

这里,我们新建一个控制台程序,代码如下:

static void Main(string[] args)
{
    string msgPath = ".\\Private$\\MyMsg";  //一个名称为“mymsg”的专用队列的路径字符串
    string studentName = "T-Max";  //要写入消息消息队列的信息
    SendMsg(msgPath, studentName);
    Console.WriteLine("发送成功");
    Console.ReadLine();
}
 
private static void SendMsg(string mQPath,string studentName)
{
    //先判断这个消息队列是否存在,如果存在则直接实例化对象,如果不存在则创建改消息队列
    MessageQueue mq = (MessageQueue.Exists(mQPath)) ? (new MessageQueue(mQPath)) : (MessageQueue.Create(mQPath)); 
    mq.Send(studentName);  //将消息发送到消息队列
}

 

此处,我们使用的是“专用队列”(Private$),至于与其他的有什么不同,不是本文重点,不在本文章赘述。运行程序后得到的控制台结果为

 

重新打开“计算机管理”,发现专用队列中多了一个“mymsg”的文件夹,在该文件夹底下还有两个文件夹,分别是“队列消息”和“日志消息”,都双击一遍发现“日志消息”是空的,而“队列消息”有一个“标签”

 

如上图,右键该标签点击“属性”,在“常规”里可以看到此条消息的“发送时间”、“到达时间”等各种详细信息,然后接着点击“正文”,我们就可以看到刚在代码里发送的消息了

 

这说明,我们已经通过代码成功的将消息发送到了消息队列中并保存在了计算机里。 完成了“存”的操作,现在开始做“取”的操作。   此处介绍两种方法,一种为异步读取,一种为同步读取。   异步读取代码如下:
static void Main(string[] args)
{
    string msgPath = ".\\Private$\\MyMsg";  //要读取的消息队列路径
    ReceiveMsg(msgPath);
    Console.ReadLine();
}
 
//异步读取
private static void ReceiveMsg(string msgPath)
{
    if (MessageQueue.Exists(msgPath))
    {
        MessageQueue mq = new MessageQueue(msgPath);
        mq.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceiveMethon);
        mq.BeginReceive(MessageQueue.InfiniteTimeout);
        Console.WriteLine("已接收数据 ");
    }
}
 
static readonly XmlMessageFormatter f = new XmlMessageFormatter(new Type[] { typeof(String) }); //格式
private static void ReceiveMethon(object sender, ReceiveCompletedEventArgs e)
{
    Message m = e.Message;
    m.Formatter = f;  //指定格式化程序
    Console.WriteLine(m.Body.ToString());
}
同步读取代码如下:

static void Main(string[] args)
{
    string msgPath = ".\\Private$\\MyMsg";  //要读取的消息队列路径
    ReceiveMsg(msgPath);
    Console.ReadLine();
}
 
static readonly XmlMessageFormatter f = new XmlMessageFormatter(new Type[] { typeof(String) }); //格式
 
//同步读取
private static void ReceiveMsg(string msgPath)
{
    if (MessageQueue.Exists(msgPath))
    {
        MessageQueue mq = new MessageQueue(msgPath);
        Message m = mq.Receive();
        m.Formatter = f; //指定格式化程序
        Console.WriteLine(m.Body.ToString());
        Console.WriteLine("已接收数据 ");
    }
}
这里简单说一下两种方式读取的区别,同步读取数据的话,会堵塞当前线程,直到读到数据为止才继续运行之后的程序,异步读取的话就避免了这个问题。如果读取的数据量小、速度快,为了编写代码方便可选择同步读取,如果读取的数据量大、速度慢,则建议使用异步读取。 运行程序后,控制台得到结果为:

 

这说明,成功的读取到了消息队列中的数据。   然后,再次打开“计算机管理”,依旧找到我们的“mymsg”,双击“队列消息”,发现标签已经消失了(如果没消失,F5刷新一下)

 

得是非常的“快递代收点”呢?快递被取走了肯定不在了。消息队列有点像我们常见的数据库,能进行数据的存取,但是与数据库其中一点不同的就是消息队里中的消息被读取后就会被销毁,不需要我们手动删除。 参考链接 https://blog.csdn.net/weixin_42359607/article/details/105977772

标签:string,MessageQueue,队列,消息,msgPath,读取
From: https://www.cnblogs.com/xuexz/p/17911684.html

相关文章

  • 清除某条会话的未读消息用engine.clearUnreadCount清除成功 code 是0 的情况下,重新拉
    确认调用清除未读数是否有传入时间戳确认时间戳是否为0,传入时间不可为0确认清除时间是否大于最新时间,不可传入大于当前时间的时间戳确认传入的时间是否大于要被清除的时间的senttime确认传入的时间是否是毫秒单位如果需要传入最新时间可以获取手机时候后根据SDK提供的服务器......
  • 当指定了一个 messageid 后,发送或插入消息,即使成功,也查询不到此消息
    SDKmessageid仅在发送失败时,可以使用SDK已经构建好的id,不支持自己指定一个自定义的id值。如果传入一个SDK不存在的id会导致消息丢失如果传入一个SDK存在的但不是当前消息的id,会导致原有消息内容发生变更,导致消息错乱。......
  • 一文讲透消息队列RocketMQ实现消费幂等
    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等。1基础概念消费幂等是指:当出现RocketMQ消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响。例如,在支付场景下,消费者消费扣款消息,对一笔订单......
  • kafka入门(四):kafka生产者发送消息
    创建生产者实例和构建消息之后,就可以开始发送消息了。发送消息主要有三种模式:发后即忘、同步、异步。发后即忘:就是直接调用生产者的send方法发送。发后即完,只管往kafka中发送消息,而不关心消息是否正确到达。这种发送方式的性能最高,可靠性也最差。producer.send(record);......
  • 删除远端消息, 重进会话仍然取回已删除的消息
    用户调用删除函数,服务器不会判断对应的sentTime是否存在,仅仅是使用sentTime直接进行消息删除,然后返回操作成功;用户删除远端消息时,需要保证sentTime的合法性-(void)deleteRemoteMessage:(RCConversationType)conversationTypetargetId:(NSString*)targetIdmessages:......
  • 解锁RocketMQ秘籍:如何保障消息顺序性?
    嗨,小伙伴们!小米在这里啦!今天我们要聊的话题是社招面试中一个经典而又百思不得其解的问题——“RocketMQ如何保证顺序性?”不用担心,小米来给你揭秘RocketMQ的秘密武器,让你轻松过关面试大关!引言:为什么要谈顺序性?首先,我们得明白为什么在消息队列中要讲究消息的顺序性。假设你正在开发一......
  • 消息队列和事件循环
    每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。但并不......
  • 向mq写消息
    1.基础版本importorg.apache.rocketmq.client.producer.DefaultMQProducer;importorg.apache.rocketmq.common.message.Message;importcom.alibaba.fastjson.JSON;publicclassMQProducer{publicstaticvoidmain(String[]args)throwsException{Def......
  • Kafka 分布式消息系统
    文章目录消息中间件对比Kafka概述kafka安装和配置kafka入门生产者发送消息消费者接收消息Kafka高可用设计集群备份机制(Replication)备份机制(Replication)-同步方式kafka生产者详解同步发送异步发送参数详解(ack)参数详解(retries)参数详解-消息压缩kafka消费者详解消费者组消息有......
  • 两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线
    以下是使用C语言写的一段代码,实现两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线程使用recvmsg函数不断接收该套接字的消息,并打印出来的功能点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.......