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;
            }
        }
    }
}

  

posted @ 2014-05-09 09:22  Aroundight  阅读(803)  评论(0编辑  收藏  举报