选择“消息队列”并单击“详细信息”。
如果运行的是 Windows Server 2003,请选择“应用程序服务器”来访问消息队列。
确保包括“MSMQ HTTP 支持”在内的所有选项在详细信息页上均处于选定状态。
单击“确定”退出详细信息页,然后单击“下一步”。完成安装。
这里我们通过实例来说明如何创建队列、发送消息、接收消息。
创建队列:
创建本机队列:@".\private$\队列名称"
创建远程队列:@"FormatName:DIRECT=TCP:远程机器IP\private$\队列名称"
实例化消息队列
////// /// 是否为本机 public MSMQManager(bool isLocalComputer) { if (isLocalComputer) { _path = @".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"); } else { _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"); } _msmq = new MessageQueue(_path); }
创建队列
////// 创建队列 /// /// 是否启用事务 ///public bool Create(bool transactional) { if (MessageQueue.Exists(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"))) { return true; } else { if (MessageQueue.Create(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null) { return true; } else { return false; } } }
发送消息队列
////// 发送消息队列 /// /// 消息队列实体 ///public void Send(MSMQIndex msmqIndex) { _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter())); }
接收消息队列,删除队列
////// 接收消息队列,删除队列 /// ///public MSMQIndex ReceiveAndRemove() { MSMQIndex msmqIndex = null; _msmq.Formatter = new BinaryMessageFormatter(); Message msg = null; try { msg = _msmq.Receive(new TimeSpan(0, 0, 1)); } catch(Exception ex) { Console.WriteLine(ex.Message); } if (msg != null) { msmqIndex = msg.Body as MSMQIndex; } return msmqIndex; }
以上代码大致说明了消息队列的创建、发送与接收,下面给出消息队列管理器的全部代码。并在附件中给出DEMO,在您安装完成消息队列后,此DEMO可以正常运行,希望对有这方面需求的人有所帮助。
消息队列管理器
using System; using System.Collections.Generic; using System.Text; using System.Messaging; using System.Configuration; namespace MSMQTest.Model { ////// 消息队列管理器 /// 作者:心海巨澜 xinhaijulan@gmail.com /// public class MSMQManager : IDisposable { #region 字段与属性 private MessageQueue _msmq = null; private string _path; private static MSMQManager _instanceLocalComputer = new MSMQManager(true); ////// 本机消息队列实例 /// public static MSMQManager InstanceLocalComputer { get { return MSMQManager._instanceLocalComputer; } } private static MSMQManager _instance = new MSMQManager(false); ////// 远程消息队列实例 /// public static MSMQManager Instance { get { return MSMQManager._instance; } } #endregion ////// 创建队列 /// /// 是否启用事务 ///public bool Create(bool transactional) { if (MessageQueue.Exists(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"))) { return true; } else { if (MessageQueue.Create(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null) { return true; } else { return false; } } } /// /// 实例化消息队列 /// /// 是否为本机 public MSMQManager(bool isLocalComputer) { if (isLocalComputer) { _path = @".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"); } else { _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"); } _msmq = new MessageQueue(_path); } ////// 发送消息队列 /// /// 消息队列实体 ///public void Send(MSMQIndex msmqIndex) { _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter())); } /// /// 接收消息队列,删除队列 /// ///public MSMQIndex ReceiveAndRemove() { MSMQIndex msmqIndex = null; _msmq.Formatter = new BinaryMessageFormatter(); Message msg = null; try { msg = _msmq.Receive(new TimeSpan(0, 0, 1)); } catch(Exception ex) { Console.WriteLine(ex.Message); } if (msg != null) { msmqIndex = msg.Body as MSMQIndex; } return msmqIndex; } #region IDisposable Members public void Dispose() { if (_msmq != null) { _msmq.Close(); _msmq.Dispose(); _msmq = null; } } #endregion } }
此DEMO只是消息队列的介绍与使用,还有一些消息队列概念未加说明,比如:
消息队列的创建方式:通过路径、通过格式名、通过标签;
消息队列接收方式:同步与异步;
消息队列序列化:字符、XML、二进制;
以及是否使用事务等。