摘抄自:http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html
在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题: 1、如何把MSMQ应用到实际的项目中去呢? 2、可不可以介绍一个实际的应用实例? 3、......
在前两篇文章里,关于MSMQ常用的技术点基本介绍完毕了,本文主要以MS开源项目PetShop中的MSMQ应用作为案例来介绍MSMQ在实际项目中的应用。在PetShop里,由于系统使用了多线程的专用应用程序来监控消息队列,在进入PetShop应用分析前,我们先来了解下关于多线程和MSMQ的相关知识点。
一、多线程和MSMQ 现在有这样一个需求,指定的消息队列里不管有无消息数据,我们通过一个多线程来监控这个队列,一但队列里的数据发生变化就做出相应的处理,比如把消息读取出来。根据这个需求,我们来做个示例,用一多线程把队列监控起来,如果队列里有消息数据,就把消息读取出来,如果没有则一直监视队列,当队列数据发生改变(有新的消息加入)的时候就作出处理(读取消息)。
public static int threadNumber = 5;//5个线程
public static Thread[] ThreadArray = new Thread[threadNumber];
我们把需要启动的线程装载入ThreadArray数组,通过一个遍历数组把所以的线程启动,实际这里只有5个线程。
private void StartThreads()
{
for (int conter = 0; conter < threadNumber; conter++)
{
ThreadArray[conter] = new Thread(new ThreadStart(listMessage));
ThreadArray[conter].Name = conter.ToString();
ThreadArray[conter].Start();
richTextBox1.Text += conter.ToString() + "线程已经运行</br>";
}
}
//开始监听
private void listent_Click(object sender, EventArgs e)
{
StartThreads();
}
//停止监听
private void stop_Click(object sender, EventArgs e)
{
for (int conter = 0; conter < threadNumber; conter++)
{
ThreadArray[conter].Abort();
richTextBox2.Text += conter.ToString() + "线程已经停止</br>";
}
}
private void listMessage()
{
while (true)
{
//取出队列里的消息
MessageBox.Show(MSMQManger.ReceiverMessage());
}
}
如果上面这段代码阅读起存在问题,建议先去了解下多线程的相关知识点。在StartThreads方法里启动数组里存储的所以线程,并委托给MSMQListen方法进行处理,MSMQListen方法完成的就是读取队列里的消息,这里我使用了在第二篇文章里所使用的MsgQueue类和Book类,详细请阅读第二篇文章ASP.NET中进行消息处理(MSMQ) 二 。 启动了5个线程,用来监视指定的消息队列,如上图。那好,我们现在就来测试一下,通过给队列里发送消息,看线程是否会有响应。从上面启动线程的代码上可以很清晰的看出,只要队列里有消息在多线程的监视下,线程就会把队列里的消息读取出来。
发送消息:
private void button3_Click(object sender, EventArgs e)
{
MSMQManger.SendQueue("标题", "我是发送的信息");
}
记住在窗体关闭时候,一定要释放信息队列资源,要不线程是未终止的:
///<summary>
/// 删除消息队列
///</summary>
public static void CloseAllMessage()
{
//连接到本地队列
MessageQueue.Delete(@".\private$\myQueue");
}