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