C#基础教程(十三)消息队列——MSMQ

2023-05-16

Net使用消息队列,借助windows组件来存储要完成的一系列任务,不用程序使用同一个队列,方便不同程序之间的数据共享和协作。

队列分事务性队列和非事务性队列,默认创建的是非事务性队列。那么什么是事务性队列呢?事务性队列将消息保存在磁盘上,实现了持久化,也就是说当我们关机,断电后,下次再启动机器,我们的消息依然保存在队列里面,而非事务性队列则将消息保存在内存中,也就是说我重启电脑后,队列里面的消息将不存在了。

(一) 复杂消息收发(对象)

static void Main(string[] args)
{
    const string queueName = @".\Private$\jiyiqin";
    MessageQueue mq = null;
    if (!MessageQueue.Exists(queueName))// 如果指定的路径queueName中不存在队列,那么在该路径,即queueName中创建一个消息队列。jiyiqin就是你想要创建消息队列的名字
    {
        mq = MessageQueue.Create(queueName);//创建名称jiyiqin的消息队列的实例。
        Console.WriteLine("创建消息队列完成:" + queueName);
    }
    else  //如果消息队列jiyiqin已经存在,那么创建该消息队列的一个实例
    {
        mq = new MessageQueue(queueName);//创建名称jiyiqin的消息队列的实例。
    }
    mq.SetPermissions("Administrator", MessageQueueAccessRights.FullControl);
    mq.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl);
    mq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);

    Message msgTx = new Message();
    msgTx.Formatter = new XmlMessageFormatter(new Type[] { typeof(MsgModel) });
    msgTx.Body = new MsgModel("1", "消息1");

    mq.Send(msgTx);
    Console.Write("成功发送消息," + DateTime.Now + "");

    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;
            Console.WriteLine(msg.id+msg.Name);
            Console.Read();
        }
    }
}

(二) 本地发/收

//发送
static void Main(string[] args)
{
    MessageQueue MSMQ = CreateMessageQueue(@".\private$\jiyiqin");
    MSMQ.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
    Console.WriteLine("是否继续发送消息:Y/N?");
    string cmd = Console.ReadLine();
    while (cmd.Equals("Y"))
    {
        Sender(MSMQ);
        Console.WriteLine("是否继续发送消息:Y/N?");
        cmd = Console.ReadLine();
    }
    Console.WriteLine("按任意键以停止...");
    Console.ReadKey();
}
private static void Sender(MessageQueue MSMQ)
{
    try
    {
        string random = new Random().Next(0,100).ToString();
        string obj = string.Format("{0} 发送方:{1}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), random);
        MSMQ.Send(obj, MessageQueueTransactionType.Single);
        Console.WriteLine(obj);

    }
    catch (Exception ex)
    {
        Console.WriteLine(string.Format("{0} 发送方:{1}",
        DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message));
    }
}

public static MessageQueue CreateMessageQueue(string path)
{
    MessageQueue mq = null;              
    if (MessageQueue.Exists(path))
    {
        //存在,创建队列实例
        mq = new MessageQueue(path);
    }
    else
    {
        //不存在,创建消息队列
        mq = MessageQueue.Create(path, true);
    }
    return mq;
}

消息队列即使接收端没开启,消息仍会阻塞在队列中,等接收端开启,就可以一条条加载消息。

(三) 异地指定队列增加消息

异地指定队列增加消息,我们测试同一局域网内两台计算机发/收。

///接收端 ip 192.168.2.240
static void Main(string[] args)
{
    MessageQueue MSMQ = CreateMessageQueue(@".\private$\jiyiqin");
    MSMQ.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

    Receiver(MSMQ);
}
private static void Receiver(MessageQueue MSMQ)
{
    while (true)
    {
        try
        {
            Message m = MSMQ.Receive(MessageQueueTransactionType.Single);
            Console.WriteLine(string.Format("{0} 接收方:[{1}]",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), m.Body.ToString()));
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("{0} 接收方:{1}",
            DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message));
        }
    }
}

public static MessageQueue CreateMessageQueue(string path)
{
    MessageQueue mq = null;

    if (MessageQueue.Exists(path))
    {
        mq = new MessageQueue(path);
    }
    else
    {
        mq = MessageQueue.Create(path, true);
    }
    return mq;
}

远程队列的路径格式:string path = @"Formatname:DIRECT=tcp:192.168.2.240\Private$\jiyiqin";  关键字不区分大小写

MSMQ 判断队列是否存在的方法(MessageQueue.Exists(string path))和创建队列(MessageQueue.Create(string path)),都是不支持远程队列的。

1.使用Exists方法会出现错误【无法确定具有指定格式名的队列是否存在】

2.使用Create方法会出现错误【无法创建路径为 FormatName:DIRECT=tcp:192.168.2.240\Private$\jiyiqin】

3.由于前两条的限制,如果要访问远程专用队列,则必须保证事先在远程机器上该队列是存在的。

static void Main(string[] args)
{
    MessageQueue MSMQ = CreateMessageQueue(@"FormatName:Direct=TCP:192.168.2.240\Private$\jiyiqin");
    MSMQ.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

    Console.WriteLine("是否继续发送消息:Y/N?");
    string cmd = Console.ReadLine();

    while (cmd.Equals("Y"))
    {
        Sender(MSMQ);
        Console.WriteLine("是否继续发送消息:Y/N?");   
        cmd = Console.ReadLine();
    }

    Console.WriteLine("按任意键以停止...");
    Console.ReadKey();
}
private static void Sender(MessageQueue MSMQ)
{
    try
    {
        string random = new Random().Next(0,100).ToString();
        string obj = string.Format("{0} 发送方:{1}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), random);
        MSMQ.Send(obj, MessageQueueTransactionType.Single);
        Console.WriteLine(obj);
    }
    catch (Exception ex)
    {
        Console.WriteLine(string.Format("{0} 发送方:{1}",
        DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message));
    }
}

public static MessageQueue CreateMessageQueue(string path)
{
    MessageQueue mq = null;  
    // MessageQueue.Exists(path)会报错
    if (true)
    {
        //存在,创建队列实例
        mq = new MessageQueue(path);
    }
    else
    {
        //不存在,创建消息队列
        mq = MessageQueue.Create(path, true);
    }
    return mq;
}

当发送消息到远程队列时,系统会在本机的传出队列下创建一个临时队列,每发送一条消息,该消息都会先存在临时队列中,这样做的目的是防止因远程队列无法访问而丢失消息,

总结

特别注意的是,如果远程机器不能成功连接,则消息就一直在临时队列中存放;如果能成功连接,即使要访问的队列并不存在,消息发送程序也不会报错,并且临时队列中的消息会删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#基础教程(十三)消息队列——MSMQ 的相关文章

  • 关于win11 最新bug edge浏览器关闭后无法打开 且 一直以来的弊病 占用cpu和内存的解决办法

    文章目录 x1f62b 前言 个人经历 x1f3f7 可能无用的方法展示 网络教程 第一步 xff1a 右键edge图标 第二步 xff1a 打开文件所在位置 第三步 xff1a 目录下寻找 msedgewebview2 执行文件 第四步
  • MySQL高级篇第一章(linux下安装MySQL)【上】

    x1f380 x1f380 x1f380 x1f380 x1f380 x1f380 x1f380 说实话实在没必要在再写一篇这样的博客 xff0c 但为了记录一下上午时光的流逝 xff0c 总结自己的学习成果 还是简单的写一下 希望能够见证
  • HTML5+css3课后习题【二】

    文章目录 x1f341 第5章 盒子模型 x1f341 x1fab6 一 判断题 x1fab6 x1f98b 二 选择题 x1f98b x1fab3 三 简答题 x1fab3 x1f7e9 第6章 列表和超链接 x1f7e9 x1f7e8
  • 树和二叉树练习题

    文章目录 一 二叉树的五大性质二 判断题三 填空题四 选择题四 分析求解题五 算法设计题 一 二叉树的五大性质 性质一 xff1a 对于一颗二叉树 xff0c 第i层的最大结点数量为 2 i
  • 微服务高级篇【1】之微服务保护

    文章目录 前言一 初识Sentinel1 1 雪崩问题1 2 解决方法1 3 小结1 4 服务保护技术对比1 5 Sentinel介绍1 6 Sentinel安装1 7 微服务整合Sentinel 二 测试工具 xff1a Jmeter2
  • 密码学【java】初探究加密方式之非对称加密

    文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5 1 保存公钥和私钥 5 2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法 非对称加密是计算机通信安全的基石 xf
  • 密码学【java】初探究加密方式之数字签名

    文章目录 前言1 数字签名简介2 基本原理3 数字证书4 网页加密5 edge的网站连接图标6 代码实现7 keytool工具使用7 1 常用命令 xff1a 7 2 生成私钥公钥 未实践成功 7 3 导出公钥 前言 有关keytool的使
  • 密码学【java】初探究之springboo集成mybatis,swagger,数字签名

    文章目录 项目环境一 swagger技术的补充1 1 swagger xff08 https github com OAI OpenAPI Specification xff09 介绍1 2 swagger的基础注解1 3 controll
  • Ubuntu查看所有用户的账号密码

    查看用户名 用任意账号 cat etc passwd 每行对应一个用户 xff0c 各列分别为 username password masked userId groupId comment homeDir shell 例如 da kao
  • Struts Action的execute方法不执行问题

    学习了SpringMVC xff0c 又想去探究一下Struts的奥秘 xff0c 是否和SpringMVC有什么异同之处 xff1f 于是 xff0c 动手编写了一个非常简单的demo程序 xff0c 但是在写的过程中 xff0c 发现页
  • JPress开源框架的安装过程 Maven工程导入MyEclipse并运行

    1 点击Jpress下载链接 https github com JpressProjects jpress 下载源码压缩包 xff0c 解压 2 复制解压后的工程到MyEclipse的工作空间中 3 点击MyEclipse gt File
  • JPress安装

    安装完成后数据库中就会生成数据表
  • jQuery LigerUI 使用教程

    首页引入样式文件和js文件 xff1a lt link href 61 34 css ligerui all css 34 rel 61 34 stylesheet 34 type 61 34 text css 34 gt lt jquer
  • myeclipse部署tomcat问题

    MyEclipse部署tomcat时出现 xff1a Deployment is out of date due to changes in the underlying project contents You 39 ll need to
  • 如何安装 EFI 分区引导

    原文链接 xff1a http www macfans com cn forum php mod 61 viewthread amp tid 61 161919 xff08 注 xff1a 这个教程只针对单硬盘安装原版OSX或双硬盘双系统
  • 【Android】系统源码下载及编译

    源码及编译 步骤 1 xff1a 创建一个空目录来存放源码 xff1a mkdir aosp cd aosp 步骤 2 xff1a 获取最新版本的 repo 并签出 android 8 1 0 r1 分支 xff1a repo init u
  • Unity3D游戏作品大盘点

    原文链接 xff1a http www unitymanual com 404 html 经典重现 新仙剑OL 新仙剑OL 采用跨平台Unity3D引擎 xff0c 耗资数千万 xff0c 历时三年多 xff0c 由台湾大宇正版授权 xff
  • Linux常见软件包格式及安装讲解

    1 在Linux中安装应用软件 Linux这一新兴操作系统 xff0c 由于系统核心源代码完全公开的缘故 xff0c 存在着许多基于GPL协议之下的分发版本 在一片反行业垄断的呼声中 xff0c 这只小企鹅近年来的发展速度实在令人振奋 其中
  • MySQL数据库安装、全量备份、增量备份与恢复

    一 数据库安装 Mysql数据库安装路径 xff1a opt mysql Mysql数据库数据文件路径 xff1a opt mysql data Mysql数据库root用户登录密码 xff1a admin 1 安装MySQL之前先检查li
  • 拓扑排序(Topological Sorting)

    一 什么是拓扑排序 在图论中 xff0c 拓扑排序 xff08 Topological Sorting xff09 是一个有向无环图 xff08 DAG Directed Acyclic Graph xff09 的所有顶点的线性序列 且该序

随机推荐

  • libjvm.so共享库找不到

    redis 64 node 1 ggs ggsci ggsci error while loading shared libraries libjvm so cannot open shared object file No such fi
  • 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)

    猴子原创 xff0c 欢迎转载 转载请注明 xff1a 转载自Cocos2Der CSDN xff0c 谢谢 xff01 原文地址 http blog csdn net cocos2der article details 44957631
  • linux简易书单

    1 Linux程序设计 xff08 第4版 xff09 万千读者推荐的Linux经典入门书 程序设计实战型图书 xff0c 以简单易懂 内容全面和示例丰富而受到广泛好评 如果你没有Linux基础 xff0c 可以先读这本 话说回来 xff0
  • Spring Boot与RabbitMQ的整合消息确认

    strong span style font size 18px 消息生产者和消费者 span strong import com rabbitmq client Channel import org slf4j Logger import
  • tomcat7下载安装

    进入apache官网下载tomcat7在最左边的找到download下的tomcat 7并点击 选择 32 bit 64 bit Windows Server Installer 下载 下载完成后 xff0c 将安装文件移动到本地硬盘D 安
  • MPU9250调试笔记(融合磁力计计算Yaw)

    底部 附源码 2022 10 5 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 产品需要一个姿态传感器 xff0c 使用了MPU9250 xff0c 主要是算法库不太好找
  • 在sql语句中,like所有的用法

    在sql结构化查询语言中 xff0c like语句有着至关重要的作用 like语句的语法格式是 xff1a select from 表名 where 字段名 like 对应值 xff08 子串 xff09 xff0c 它主要是针对字符型字段
  • 解决当使用element table fix column 固定列时,滚动条在固定列下方无法滚动

    解决当使用element table fix column 固定列时 xff0c 滚动条在固定列下方无法滚动 在全局css中添加这行代码 xff0c 提高滚动条在z轴的坐标 建议使用下面的代码 xff0c 使用参考文章里面的代码会导致 右f
  • 使用funcraft管理阿里云函数计算

    Fun 是一个用于支持Serverless应用部署的工具 xff0c 能帮助您便捷地管理函数计算 API 网关和日志服务等资源 它通过一个资源配置文件 xff08 template yml xff09 xff0c 协助您进行开发 构建和部署
  • 阿里云 ServerLess:Todo list 应用安装

    安装Node js环境 执行如下命令 xff0c 下载Node js安装包 xff1a wget https npm taobao org mirrors node v12 4 0 node v12 4 0 linux x64 tar xz
  • Maven中pom.xml的scope

    一 compile xff1a 编译范围 compile是默认的范围 xff1b 如果没有提供一个范围 xff0c 编译范围依赖在所有的classpath 中可用 xff0c 同时它们也会被打包 而且这些dependency会传递到依赖的项
  • 如何通过CSS绘制三角形和小箭头

    1 绘制三角形的作用 xff0c 主要是提供指示性 xff0c 如下图 2 那么如何画出三角形呢 xff1f 我们先看下border的用法 lt div class 61 34 box 34 gt lt div gt box box siz
  • 利用python pil 实现给图片上添加文字

    最近的一个工程项目是讲文字添加到图像上 使用了opencv xff0c 结果发现利用opencv给图像添加文字有局限 xff08 1 xff09 可利用的字体类型比较少 xff0c 需要安装Freetype扩展 xff0c 比较复杂 xff
  • esp8266 error: espcomm_open failed

    gpi0 没有接地 xff0c 接上地就可以了注意和usb分出的gnd接口接的是同一个地
  • 微信小程序quickstart项目中有关userInfoReadyCallback的解释

    userInfoReadyCallback 在index js中定义 xff0c 在app js中使用 附app js代码 xff1a app js App onLaunch function 展示本地存储能力 var logs 61 wx
  • 微信小程序引入模块中wxml、wxss、js

    先描述下目录结构 xff0c 见下图 UI页面见下图 其中ok按键是引入的log模块 xff0c log模块非page页 indexButton是index页本身拥有的组件 xff0c index页直接导入Log模块中的组件 xff0c c
  • PHP解析错误 PHP Parse error: syntax error, unexpected '[' in

    之前做了一次php后台代码在不同服务器的迁移 xff0c 代码迁移到新服务器上 xff0c 代码运行不了 xff0c 返回500内部错误 500 内部错误 xff0c 就查看服务器上 var log php fpm www error lo
  • 微信小程序使用video组件时的一些坑

    xff08 1 xff09 mp4视频用video组件播放会卡顿 绿屏 尤其是在快进 拖动时间条时 在video组件上 xff0c 试试加个custom cache 61 false 属性 xff0c 可以完美解决卡顿 绿屏的现象 xff0
  • java中JFrame中函数removeAll的用法

    解答链接 用baidu搜了半天搜不出来 xff0c 用google一下就出来了 下面用自己的代码来解释下removeAll xff08 xff09 的用法 注意一定要在getContentPane xff08 xff09 中用removeA
  • C#基础教程(十三)消息队列——MSMQ

    Net使用消息队列 xff0c 借助windows组件来存储要完成的一系列任务 xff0c 不用程序使用同一个队列 xff0c 方便不同程序之间的数据共享和协作 队列分事务性队列和非事务性队列 xff0c 默认创建的是非事务性队列 那么什么