我学MSMQ(二)
上次我主要学习的是MSMQ的基本的概念、安装消息队列和新建了一个简单的队列。
现在我就继续学习关于消息队列的接收
先还是概念
消息的接收又分成同步和异步方式两种,同步接收在规定时间内从消息队列中取出收到的第一条消息,当消息队列中没有消息时,程序处于等待状态;异步接收方式则是定义了一个事件处理函数,当消息队列中第一个消息到达时立即触发该函数。
接下来我就做个实验:
private void FSend()
{
string queuename = ".\\private$\\testQueue";//队列名称
MessageQueue q;
if (MessageQueue.Exists(queuename))
{
q = new System.Messaging.MessageQueue(queuename);
}
else
{
q = MessageQueue.Create(queuename);
}
Message m = new Message();
m.Label = "MessageLabel"; //描述消息的字串
m.Body = Send.Text; //消息的主体
q.Send(m); //发送
}
{
string queuename = ".\\private$\\testQueue";//队列名称
MessageQueue q;
if (MessageQueue.Exists(queuename))
{
q = new System.Messaging.MessageQueue(queuename);
}
else
{
q = MessageQueue.Create(queuename);
}
Message m = new Message();
m.Label = "MessageLabel"; //描述消息的字串
m.Body = Send.Text; //消息的主体
q.Send(m); //发送
}
发送消息,上次做过一个,很简单
然后我就做了同步接收的方法:
private void Recevie()
{
string queuename = ".\\private$\\testQueue";//队列名称
MessageQueue q;
q = new System.Messaging.MessageQueue(queuename);
Message m = q.Receive();
m.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
Recieve.Text = m.Body.ToString();
}
{
string queuename = ".\\private$\\testQueue";//队列名称
MessageQueue q;
q = new System.Messaging.MessageQueue(queuename);
Message m = q.Receive();
m.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
Recieve.Text = m.Body.ToString();
}
然后看结果
然后我们在证实下“同步接收在规定时间内从消息队列中取出收到的第一条消息,当消息队列中没有消息时,程序处于等待状态” 。
大家有看到进度条吗?它就一直在等待中,然后我再打开一个页面,再发送一个消息,我们就能看到,他马上就能接收
做完了同步的,然后我继续在实验异步的,看看消息队列是怎么操作的
private void RecevieAsynchronism()
{
string queuename = ".\\private$\\testQueue"; //队列名称
MessageQueue q;
q = new System.Messaging.MessageQueue(queuename);
Message m=q.Peek(); //不删除接收到的消息
//被动方式,异步调用方式,不会阻塞当前线程
q.ReceiveCompleted +=new ReceiveCompletedEventHandler( ReceivedEvt); //事件
q.BeginReceive();
}
public void ReceivedEvt(object source, ReceiveCompletedEventArgs asyncResult)
{
//其中ReceivedEvt要么为静态函数,要么必须是属于实例化的对象的可访问函数
try
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
//此事m为异步接收到的消息
//在此插入处理消息的代码
m.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
t_Recieve.Text = m.Body.ToString();
mq.BeginReceive();//接收下一次事件
}
catch (MessageQueueException)
{
}
return;
}
{
string queuename = ".\\private$\\testQueue"; //队列名称
MessageQueue q;
q = new System.Messaging.MessageQueue(queuename);
Message m=q.Peek(); //不删除接收到的消息
//被动方式,异步调用方式,不会阻塞当前线程
q.ReceiveCompleted +=new ReceiveCompletedEventHandler( ReceivedEvt); //事件
q.BeginReceive();
}
public void ReceivedEvt(object source, ReceiveCompletedEventArgs asyncResult)
{
//其中ReceivedEvt要么为静态函数,要么必须是属于实例化的对象的可访问函数
try
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
//此事m为异步接收到的消息
//在此插入处理消息的代码
m.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
t_Recieve.Text = m.Body.ToString();
mq.BeginReceive();//接收下一次事件
}
catch (MessageQueueException)
{
}
return;
}
首先定义了一个事件,当第一个消息到达的时候,就触发事件,读取消息.首先我们先来看结果
我们按发送消息,然后在按接受消息,发现他竟然是等待,为什么呢?
下面是我个人的理解,不是对否,希望有人指出
首先在按发送消息的时候,其实就有了第一个消息,然后就触发了事件,已经把消息读了出来,所以在按接受按钮的时候,就没有了消息,就只能等待,可是还有个问题,既然实现了事件,那事件里面不是有对文本框进行赋值的吗?其实他只要是异步的原因,因为这个事件在后台运行的,真正的asp.net的代码已经返回给客户端了,不知道我这样理解是否正确
今天只要是学习了同步和异步的接收消息,但是还有很多的问题还没搞清楚,比如 消息的并发性,怎么结合数据库使用,怎么样发送复杂的消息等等,这些问题还有待解决