• 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)实例::::::::::

  • 相关阅读:
    图片处理工具类
    基于Redis的在线用户列表解决方案
    Windows安装Mysql5.7.10绿色版
    开启MongoDB客户端访问控制
    在Windows上安装MongoDB
    MongoDB介绍
    常用linux命令
    添加本地jar包到本地的Maven仓库以及在Maven仓库中搜索想要添加的jar包
    Centos6.5安装memcached
    Archive for required library:xxxxx/spring-beans-3.2.4.RELEASE.jar in project XXXXX cannot be read or is not a valid ZIP file
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1541689.html
Copyright © 2020-2023  润新知