MQ单一消息完整流程

简介: public class QueueManger { private static string QueuePath = @".\private$\{0}"; /// /// 创建MSMQ队列 ...
public class QueueManger
    {
        private static string QueuePath = @".\private$\{0}";
            
        /// <summary>
        /// 创建MSMQ队列
        /// </summary>
        /// <param name="queueName">队列路径</param>
        /// <param name="transactional">是否事务队列</param>
        public static void Createqueue(string queueName, bool transactional = false)
        {
            try
            {
                QueuePath = string.Format(QueuePath, queueName);
                //判断队列是否存在
                if (!MessageQueue.Exists(QueuePath))
                {
                    MessageQueue.Create(QueuePath);
                    LoggerFile.Write(QueuePath + "已成功创建!"); 
                }
                else
                {
                    LoggerFile.Write(QueuePath + "已经存在!"); 
                }
            }
            catch (MessageQueueException e)
            {
                LoggerFile.Write(e.Message); 
            }
        }
        /// <summary>
        /// 删除队列
        /// </summary>
        /// <param name="queueName"></param>
        public static void Deletequeue(string queueName)
        {
            try
            {
                QueuePath = string.Format(QueuePath, queueName);
                //判断队列是否存在
                if (MessageQueue.Exists(QueuePath))
                {
                    MessageQueue.Delete(QueuePath);
                    LoggerFile.Write(QueuePath + "已删除!");
                }
                else
                {
                    LoggerFile.Write(QueuePath + "不存在!");
                }
            }
            catch (MessageQueueException e)
            {
                LoggerFile.Write(e.Message);
            }
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <typeparam name="T">用户数据类型</typeparam>
        /// <param name="target">用户数据</param>
        /// <param name="queueName">队列名称</param>
        /// <param name="tran"></param>
        /// <returns></returns>
        public static bool SendMessage<T>(T target, string queueName, MessageQueueTransaction tran = null)
        {
            try
            {
                QueuePath = string.Format(QueuePath, queueName);
                //连接到本地的队列
                MessageQueue myQueue = new MessageQueue(QueuePath);
                System.Messaging.Message myMessage = new System.Messaging.Message();
                myMessage.Body = target;
                myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
                //发送消息到队列中
                if (tran == null)
                {
                    myQueue.Send(myMessage);
                }
                else
                {
                    myQueue.Send(myMessage, tran);
                }
                LoggerFile.Write("消息已成功发送到" + queueName + "队列!");
                return true;
            }
            catch (ArgumentException e)
            {
                LoggerFile.Write(e.Message);
                return false;
            }
        }
        /// <summary>
        /// 接收消息
        /// </summary>
        /// <typeparam name="T">用户的数据类型</typeparam>
        /// <param name="queueName">消息路径</param>
        /// <returns>用户填充在消息当中的数据</returns>
        public static T ReceiveMessage<T>(string queueName, MessageQueueTransaction tran = null)
        {
            QueuePath = string.Format(QueuePath, queueName);
            //连接到本地队列
            MessageQueue myQueue = new MessageQueue(QueuePath);
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
            try
            {
                //从队列中接收消息
                System.Messaging.Message myMessage = tran == null ? myQueue.Receive() : myQueue.Receive(tran);
                return (T)myMessage.Body; //获取消息的内容
            }
            catch (MessageQueueException e)
            {
                LoggerFile.Write(e.Message);
            }
            catch (InvalidCastException e)
            {
                LoggerFile.Write(e.Message);
            }
            return default(T);
        }
        /// <summary>
        /// 采用Peek方法接收消息
        /// </summary>
        /// <typeparam name="T">用户数据类型</typeparam>
        /// <param name="queueName">队列路径</param>
        /// <returns>用户数据</returns>
        public static T ReceiveMessageByPeek<T>(string queueName)
        {
            QueuePath = string.Format(QueuePath, queueName);
            //连接到本地队列
            MessageQueue myQueue = new MessageQueue(QueuePath);
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
            try
            {
                //从队列中接收消息
                System.Messaging.Message myMessage = myQueue.Peek();
                return (T)myMessage.Body; //获取消息的内容
            }
            catch (MessageQueueException e)
            {
                LoggerFile.Write(e.Message);
            }
            catch (InvalidCastException e)
            {
                LoggerFile.Write(e.Message);
            }
            return default(T);
        }
        /// <summary>
        /// 获取队列中的所有消息
        /// </summary>
        /// <typeparam name="T">用户数据类型</typeparam>
        /// <param name="queueName">队列路径</param>
        /// <returns>用户数据集合</returns>
        public static List<T> GetAllMessage<T>(string queueName)
        {
            QueuePath = string.Format(QueuePath, queueName);
            MessageQueue myQueue = new MessageQueue(QueuePath);
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
            try
            {
                Message[] msgArr = myQueue.GetAllMessages();
                List<T> list = new List<T>();
                msgArr.ToList().ForEach((o) =>
                {
                    list.Add((T)o.Body);
                });
                return list;
            }
            catch (Exception e)
            {
                LoggerFile.Write(e.Message);
            }
            return null;
        }
    }

  

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
执行 composer update 命令会直接更新依赖包,可能会导致某些依赖包之间的兼容性问题,如何解决这个问题?底层原理是什么?
执行 composer update 命令会直接更新依赖包,可能会导致某些依赖包之间的兼容性问题,如何解决这个问题?底层原理是什么?
1154 0
|
弹性计算 安全 Ubuntu
阿里云ECS搭建禅道
由于最近换工作,发现新公司问题记录跟踪还在用excel,于是强烈建议使用项目管理工具,并获得批准,在比较了禅道和JIRA,还是选择了禅道,禅道的上下级联的层级关系可能更符合国人的使用习惯,秉承着谁出主意谁干活儿的国际惯例,这个事情也就落到我的头上,于是在阿里云从头开始搭建,这里作个记录。
685 0
阿里云ECS搭建禅道
|
6月前
|
移动开发 JavaScript 前端开发
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
225 7
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
|
7月前
|
XML Java 数据库连接
十一、MyBatis的逆向工程
十一、MyBatis的逆向工程
186 6
十一、MyBatis的逆向工程
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
171 0
|
10月前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
10月前
|
Prometheus 监控 Cloud Native
服务器监控软件
【10月更文挑战第18天】
312 1
|
运维 Serverless API
两全其美,Sidecarless 与 Sidecar 模式融合的服务网格新形态
本文主要介绍 ASM 如何落地这种 Sidecarless 和 Sidecar 模式融合的服务网格新形态,以及服务网格的 Serverless 化。
53143 105
|
应用服务中间件 Linux 网络安全
PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
在Azure App Service for Linux上部署的PHP应用遇到上传文件超过1MB时出现413 Request Entity Too Large错误的解决之法
386 0