zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }
    }
    

      

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/aroundight/p/3718192.html
Copyright © 2011-2022 走看看