• MSMQ发送和接收


    using System;
    using System.IO;
    using System.Messaging;
    
    namespace YURE.PAIWEI.BALIANGUI
    {
        /// <summary>
        /// MQ文件发送
        /// 所有异常都将抛出请做好异常处理
        /// </summary>
        public static class MSMQModel 
        {
            /// <summary>
            /// 向队列中发送对象
            /// </summary>
            /// <param name="FilePath">文件路径</param>
            /// <param name="MQPath">队列地址</param>
            /// <returns>bool</returns>
            public static bool Send(string FilePath, string MQPath)
            {
                try
                {
                    MQModel mm = new MQModel(MQPath);
                    Message message = new Message();
                    message.Formatter = new BinaryMessageFormatter();
                    message.Label = Path.GetFileName(FilePath);
                    byte[] streams = FileChange.ConvertToBinary(FilePath);
                    if (streams != null)
                    {
                        message.Body=streams; 
                        mm.Inqueue.Send(message);
                        mm.Inqueue.Dispose();
                        return true;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return false;
            }
    
            /// <summary>
            /// 向队列中取出对象并删除对象,接收只能接收本地的队列信息,如要接收远程队列的信息请先获取该服务器的权限否则将报错。
            /// 成功返回文件路径否则返回NULL
            /// </summary>
            /// <param name="FilePath">对象保存路径</param>
            /// <param name="MQPath">队列地址</param>
            /// <returns>string文件存放路径</returns>
            public static string Receive(string FilePath, string MQPath)
            {
                try
                {
                    MQModel mm = new MQModel(MQPath);
                    Message message = new Message();
                    message = mm.Inqueue.Receive();
                    mm.Inqueue.Dispose();
                    if (message != null)
                    {
                        if (FileChange.BinaryToConver(FilePath + @"" + message.Label, (byte[])message.Body))
                        {
                            return FilePath + @"" + message.Label;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return null;
            }
    
            /// <summary>
            /// 创建消息队列(创建前请先确定队列不存在,不支持创建远程队列)
            /// </summary>
            /// <param name="transactional">是否启用事务</param>
            /// <param name="MqPath">MQ队列地址</param>
            /// <returns></returns>
            public static void Create(bool transactional, string MqPath)
            {
                try
                {
                    MQModel mm = new MQModel(transactional, MqPath);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    
        /// <summary>
        /// 二进制流和文件之间相互转化
        /// </summary>
        class FileChange
        {
            /// <summary>
            /// 将文件转换成二进制
            /// </summary>
            /// <param name="Path">文件路径</param>
            /// <returns>byte[]</returns>
            public static byte[] ConvertToBinary(string Path)
            {
                FileStream stream = new FileInfo(Path).OpenRead();
                byte[] buffer = new byte[stream.Length];
                try
                {
                    stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
                    return buffer;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    stream.Close();
                }
            }
    
            /// <summary>
            /// 将二进制转换成文件
            /// </summary>
            /// <param name="FilePath">文件保存路径</param>
            /// <param name="br">二进制流</param>
            public static bool BinaryToConver(string FilePath, byte[] br)
            {
                FileStream fstream = File.Create(FilePath, br.Length);
                try
                {
                    fstream.Write(br, 0, br.Length);   //二进制转换成文件
                    return true;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    fstream.Close();
                }
            }
        }
    
        /// <summary>
        /// 消息队列管理器
        /// </summary>
        class MQModel : IDisposable
        {
            //队列
            private MessageQueue MSMQqueue = null;
            //队列链接字符串
            private string path;
    
            /// <summary>
            /// 实例化消息队列(队列已存在)
            /// </summary>
            /// <param name="MqPath">链接队列字符串</param>
            public MQModel(string MqPath)
            {
                path = MqPath;
                try
                {
                    MSMQqueue = new MessageQueue(path);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 实例化消息队列(队列不存在,先创建后实例化)
            /// </summary>
            /// <param name="transactional">是否启动事务</param>
            /// <param name="MqPath">链接队列字符串</param>
            public MQModel(bool transactional, string MqPath)
            {
                path = MqPath;
                try
                {
                    Create(transactional);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 获取消息队列实例
            /// </summary>
            public MQModel Inqueue
            {
                get { return this; }
            }
    
            /// <summary>
            /// 创建队列MessageQueue.Create不支持创建远程队列
            /// </summary>
            /// <param name="transactional">是否启用事务</param>
            /// <returns>bool</returns>
            public bool Create(bool transactional)
            {
                try
                {
                    if (MessageQueue.Create(path, transactional) != null)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 发送消息队列
            /// </summary>
            /// <param name="message">Message消息</param>
            /// <returns></returns>
            public void Send(Message message)
            {
                try
                {
                    MSMQqueue.Send(message);
                    //MSMQqueue.Send(message, MessageQueueTransactionType.Single);//启用事务
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 接收消息队列信息并删除
            /// </summary>
            /// <returns>Message</returns>
            public Message Receive()
            {
                try
                {
                    MSMQqueue.Formatter = new BinaryMessageFormatter();
                    Message message = new Message();
                    message = MSMQqueue.Receive(TimeSpan.FromMilliseconds(1));
                    //message = MSMQqueue.Receive(TimeSpan.FromMilliseconds(10), MessageQueueTransactionType.Single);//启用事务
                    return message;
                }
                catch (MessageQueueException ex)//队列中无信息时报错
                {
                    if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
                    {
                        throw ex;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return null;
            }
    
            /// <summary>
            /// 清空队列实例
            /// </summary>
            public void Dispose()
            {
                if (MSMQqueue != null)
                {
                    MSMQqueue.Close();
                    MSMQqueue.Dispose();
                    MSMQqueue = null;
                }
            }
        }
    }
    

      

  • 相关阅读:
    fastjson对象,JSON,字符串,map之间的互转
    bootstrap的页面刷新以及模态框的清空
    change 和 propertychange 事件监听input 并发起ajax请求
    jquery 获取和设置select的option值
    Mybatis中使用@Select注解进行模糊查询,使用concat关键字
    mysql 获取表字段及注释
    SpringBoot 在IDEA中实现热部署
    jquery与css控制元素的隐藏和显示的几种方法
    Java8 stream的详细用法
    FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法
  • 原文地址:https://www.cnblogs.com/aroundight/p/3718192.html
Copyright © 2020-2023  润新知