![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//
顾名思义,微软消息队列(MSMQ)是一种给队列发送消息以便稍后进行处理的方法。
// 消息由一个“Producer”(生产者)应用程序发送出去,再由一个“Consumer”(消费者)应用程序返回。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Messaging;
using System.Threading;
namespace Model
{
public class MSM
{
private MessageQueue _messageQueue = null ;
private string queuePath = @" .\Private$\MSMQ " ;
private string formatType = " xml " ;
public MessageQueue MessQueue
{
get
{
if (_messageQueue == null )
{
if (MessageQueue.Exists(queuePath))
{
_messageQueue = new MessageQueue(queuePath);
}
else
{
_messageQueue = MessageQueue.Create(queuePath);
}
}
return _messageQueue;
}
}
// 发送消息
public void SendMessage(User u)
{
if (formatType == " xml " )
{
MessQueue.Formatter = new XmlMessageFormatter();
}
else
{
MessQueue.Formatter = new BinaryMessageFormatter();
}
Message m = new Message(u);
MessQueue.Send(m);
}
// MessageQueue.Receive得到队列中的第一条消息,并从队列中删除这条消息
public User Recieve( int timeout)
{
Message m = MessQueue.Receive(TimeSpan.FromSeconds(timeout));
m.Formatter = new System.Messaging.XmlMessageFormatter( new Type[] { typeof (User) });
return (User)m.Body;
}
// MessageQueue.Receive得到队列中的第一条消息,但不从队列中删除这条消息
public User Peek( int timeout)
{
Message m = MessQueue.Peek(TimeSpan.FromSeconds(timeout));
m.Formatter = new System.Messaging.XmlMessageFormatter( new Type[] { typeof (User) });
return (User)m.Body;
}
// 最常见的情况是从队列中取出所有消息,然后一次性处理它们。这时要调用MessageQueue.GetAllMessages方法。
public List < User > RecieveMessage()
{
List < User > users = new List < User > ();
MessQueue.Formatter = new XmlMessageFormatter( new Type[] { typeof (User) });
foreach (Message m in MessQueue.GetAllMessages())
{
users.Add((User)m.Body);
}
return users;
}
// GetMessageEnumerator2方法只领取当前消息在本地保存,在调用MoveNext时才领取下一条消息
public List < User > RecieveMessage2()
{
MessageEnumerator enumerator = MessQueue.GetMessageEnumerator2();
MessQueue.Formatter = new XmlMessageFormatter( new Type[] { typeof (User) });
List < User > users = new List < User > ();
while (enumerator.MoveNext())
{
users.Add ((User)enumerator.Current.Body);
enumerator.RemoveCurrent(); // 删除当前消息
}
return users;
}
}
}
下面简单的测试一下:
发送消息:
class Send
{
static void Main( string [] args)
{
MessageSendTest();
Console.ReadLine();
}
public static void MessageSendTest()
{
MSM msm = new MSM();
for ( int i = 0 ; i < 10 ; i ++ )
{
User user = new User()
{
UserId = i.ToString(),
UserName = " userName: " + i.ToString(),
UserPwd = " UserPWd: " + i.ToString(),
Version = " Version: " + i.ToString()
};
Thread.Sleep( 5000 );
msm.SendMessage(user);
Console.WriteLine( " 已发送: " + user.UserId + " ----- " + user.UserName + " ----- " + user.UserPwd + " ----- " + user.Version);
}
// List<User> users=msm.RecieveMessage();
// foreach (User user in users)
// {
// Console.WriteLine("已发送:" + user.UserId + "-----" + user.UserName + "-----" + user.UserPwd + "-----" + user.Version);
// }
}
}
接收消息:
class Recieve
{
static void Main( string [] args)
{
while ( true )
{
GetMessage();
}
}
public static void GetMessage()
{
MSM msm = new MSM();
User user = msm.Recieve( 5 );
Console.WriteLine( " 已接收: " + user.UserId + " ----- " + user.UserName + " ----- " + user.UserPwd + " ----- " + user.Version);
}
}
// 消息由一个“Producer”(生产者)应用程序发送出去,再由一个“Consumer”(消费者)应用程序返回。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Messaging;
using System.Threading;
namespace Model
{
public class MSM
{
private MessageQueue _messageQueue = null ;
private string queuePath = @" .\Private$\MSMQ " ;
private string formatType = " xml " ;
public MessageQueue MessQueue
{
get
{
if (_messageQueue == null )
{
if (MessageQueue.Exists(queuePath))
{
_messageQueue = new MessageQueue(queuePath);
}
else
{
_messageQueue = MessageQueue.Create(queuePath);
}
}
return _messageQueue;
}
}
// 发送消息
public void SendMessage(User u)
{
if (formatType == " xml " )
{
MessQueue.Formatter = new XmlMessageFormatter();
}
else
{
MessQueue.Formatter = new BinaryMessageFormatter();
}
Message m = new Message(u);
MessQueue.Send(m);
}
// MessageQueue.Receive得到队列中的第一条消息,并从队列中删除这条消息
public User Recieve( int timeout)
{
Message m = MessQueue.Receive(TimeSpan.FromSeconds(timeout));
m.Formatter = new System.Messaging.XmlMessageFormatter( new Type[] { typeof (User) });
return (User)m.Body;
}
// MessageQueue.Receive得到队列中的第一条消息,但不从队列中删除这条消息
public User Peek( int timeout)
{
Message m = MessQueue.Peek(TimeSpan.FromSeconds(timeout));
m.Formatter = new System.Messaging.XmlMessageFormatter( new Type[] { typeof (User) });
return (User)m.Body;
}
// 最常见的情况是从队列中取出所有消息,然后一次性处理它们。这时要调用MessageQueue.GetAllMessages方法。
public List < User > RecieveMessage()
{
List < User > users = new List < User > ();
MessQueue.Formatter = new XmlMessageFormatter( new Type[] { typeof (User) });
foreach (Message m in MessQueue.GetAllMessages())
{
users.Add((User)m.Body);
}
return users;
}
// GetMessageEnumerator2方法只领取当前消息在本地保存,在调用MoveNext时才领取下一条消息
public List < User > RecieveMessage2()
{
MessageEnumerator enumerator = MessQueue.GetMessageEnumerator2();
MessQueue.Formatter = new XmlMessageFormatter( new Type[] { typeof (User) });
List < User > users = new List < User > ();
while (enumerator.MoveNext())
{
users.Add ((User)enumerator.Current.Body);
enumerator.RemoveCurrent(); // 删除当前消息
}
return users;
}
}
}
下面简单的测试一下:
发送消息:
class Send
{
static void Main( string [] args)
{
MessageSendTest();
Console.ReadLine();
}
public static void MessageSendTest()
{
MSM msm = new MSM();
for ( int i = 0 ; i < 10 ; i ++ )
{
User user = new User()
{
UserId = i.ToString(),
UserName = " userName: " + i.ToString(),
UserPwd = " UserPWd: " + i.ToString(),
Version = " Version: " + i.ToString()
};
Thread.Sleep( 5000 );
msm.SendMessage(user);
Console.WriteLine( " 已发送: " + user.UserId + " ----- " + user.UserName + " ----- " + user.UserPwd + " ----- " + user.Version);
}
// List<User> users=msm.RecieveMessage();
// foreach (User user in users)
// {
// Console.WriteLine("已发送:" + user.UserId + "-----" + user.UserName + "-----" + user.UserPwd + "-----" + user.Version);
// }
}
}
接收消息:
class Recieve
{
static void Main( string [] args)
{
while ( true )
{
GetMessage();
}
}
public static void GetMessage()
{
MSM msm = new MSM();
User user = msm.Recieve( 5 );
Console.WriteLine( " 已接收: " + user.UserId + " ----- " + user.UserName + " ----- " + user.UserPwd + " ----- " + user.Version);
}
}
结果是每个5秒发送一个队列,Reciew就马上得到该队列。