在传送数据时,接受者可以离线。
在以后的某个时刻,接收者上线时,就会接收到数据,而无需应用程序的干预。
2.message queuing特性
。 消息可以再断开连接的环境下发送。不需要同时运行发送和接受应用程序。
。使用快递模式,消息可以非常快的发送。在快递模式,消息存储在内存中。
。对于恢复机制,消息可以使用有保证的交付方式发送。可恢复的消息存储在文件中。在服务器重启时发送他们。
。消息队列用访问控制表来保护,确定了哪些用户可以发送或接收队列中的消息。消息还可以加密,避免网络嗅探器读取其中的数据。
。消息在发送时可以指定优先级,更快的处理高优先级的项。
3.消息队列有几种类型的消息:
一般消息:由应用程序发送。
确认消息:报告一般消息的状态。确认消息发送到管理队列中,报告一般消息的发送是否成功。
响应消息:当最初的发送者需要某种回应时,由接收应用程序发送。
报告消息:由message queuing系统生成。测试消息和路由跟踪消息属于此类。
4.消息可以有优先级
5消息有两种传递模式:快速模式和可恢复模式。
快递消息的传送速度非常快,因为消息只使用内存来存储。
可恢复消息在路由的每一个阶段都要存储在文件中,直到消息传送到目的地为止。这样,即使计算机重启或网络失败
6事务消息是可恢复消息的一种特殊版本。在事务消息传递过程中,可以确保消息只能到达目的地一次,且按照它们发送的顺序到达目的地。优先级不能在事务消息中使用。
7消息队列
公共队列
私有队列
日志队列
死信队列
管理队列
响应队列
报告队列
系统队列
7message queuing的编程实现
1)创建消息队列
using( MessageQueue queue=MessageQueue .Create(@".\MyNewPublicQueue"))
{
}
2)查找队列
公共队列在active directory中发布,无需知道它们所在的系统。
私有队列只有在已知队列所在的系统名时才能找到。
可以通过标签、类别或格式名找到队列
找公共队列:GetPublicQueuesByLable() GetPublicQUeuesByCategry() 和GetPublicQueuesByMachine()
GetPublicQueues()方法返回包含域中所有公共队列的数据。
3)打开已知的队列
。。。。。。。。。。
4)发送消息
5)消息格式化器
MessageQueue 类有一个Formatter属性,通过它可以指定格式化器。
3种格式化器 :
XmlMessageFormatter是默认的格式化器,它使用xml串行化对象。
BinaryMessageFormatter用二进制格式对消息进行串行化。这些消息比使用xml格式化的消息短。
ActiveMessageFormatter是一个二进制格式化器。。。。
System.Messaging.MessageQueue queue = null;
if (!MessageQueue.Exists(".\\Private$\\MSMQDemo8"))
{
queue = MessageQueue.Create(".\\Private$\\MSMQDemo8");
}
else
{
queue = new MessageQueue(".\\Private$\\MSMQDemo8");
}
// Create message
System.Messaging.Message message = new System.Messaging.Message();
message.Body = txtMessage.Text.Trim();
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
// Put message into queue
queue.Send(message);
6)接收消息
通过Receive()方法可以读取一个消息,再将该消息从队列中删除。
如果消息是使用不同的优先级发送的,就读取优先级最高的消息。读取优先级相同的消息时,第一个发送的消息不一定是第一个读取的,因为在网络中的传送顺序无法保证。要保证发送顺序和读取顺序相同,可以使用事务消息队列。
之前传入的是什么格式的再接收后用相应的格式化器格式。
System.Messaging.MessageQueue queue = new MessageQueue(".\\Private$\\MSMQDemo8");
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
System.Messaging.Message message = queue.Receive();
txtReceiveMessage.Text = message.Body.ToString();
1)枚举消息:使用迭代器时,消息不会从队列中删除,但可以查看他们的内容。
System.Messaging.MessageQueue queue = new MessageQueue(".\\Private$\\MSMQDemo8");
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
foreach(Message message in queue)
{
txtReceiveMessage.Text = message.Body.ToString();
}
还可以使用MessageEnumerator实现了IEmumerator接口
实现了IEnumerable接口就表示不从队列中删除消息。
MessageEnumerator类的RemoverCurrent()方法可以从枚举器的当前光标位置删除消息。
using(MessageEnumerator message=queue.GetMessageEnumerator())
{
while(message.MoveNext(TimeSpan.FormMinutes(30)))
{
Message message=messages.Current;
message.Body;
}
}
2)异步读取
MesssageQueue类的Receive方法会等到队列中的消息可以读取为止。
为了避免阻碍线程的执行,可以再Receive方法的一个重载版本中指定一个超时的设置。
要从超时后读取队列中的消息,必须再次调用Receive()方法。
调用BegionReceive()异步方法,在这之前应设置ReceiveCompleted事件
queue.ReceiveCompleted+=new ReceiveCompletedEventHander(MessageArrived);
queue.BegionReveive();
MessageArrived方法处理程序需要两个参数,第一个是事件源messagequeue,第二个参数
public static void messagearrived(object source, ReceiveCompletedEnventArgs e )
{
MessageQueue queue=(MessageQueue)source;
Message message=queue.EndReceive(e.AsyncResult);
message.Body;
}
3)实例::::::::::