messagequeuing 消息队列

1.message queuing是异步进行,与伊布编程有很大的区别。
   在传送数据时,接受者可以离线。
   在以后的某个时刻,接收者上线时,就会接收到数据,而无需应用程序的干预。
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)实例::::::::::

原文地址:https://www.cnblogs.com/aaa6818162/p/1541689.html