.net消息队列
代码
//顾名思义,微软消息队列(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就马上得到该队列。