zoukankan      html  css  js  c++  java
  • MSMQ消息传递的优先级

    一、消息传递的优先级
    在MSMQ中消息在队列里传输是分有优先级的,这里我就以实例的形式介绍下关于优先级的使用,优先级一共有七种,MessagePriority枚举里全部进行了封装。因这里只作程序演示就不一一列举出,仅用了Highest和Normal两种类型,关于消息队列上进行消息传输的七种优先级大家可以参考我下面提供的MessagePriority枚举源代码定义。
    那么在发送消息的时候怎么指定消息的优先级呢?在Message对象里封装有一个属性Priority,接受一个枚举MessagePriority类型的值来设置消息传输的优先级。如下:
    1System.Messaging.Message message = new System.Messaging.Message();
    2message.Priority = MessagePriority.Highest; //最高消息优先级


    1private void btnSend_Click(object sender, EventArgs e)

    2{
    //连接到本地的专用队列myQueue
    MessageQueue myQueue = new MessageQueue(".\private$\myQueue");
    System.Messaging.Message message = new System.Messaging.Message();
    message.Label = tbName.Text;
    message.Body = tbContext.Text;

    if (cbPriority.Checked)
    {
    message.Priority = MessagePriority.Highest;
    }
    else
    {
    message.Priority = MessagePriority.Normal;
    }
    myQueue.Send(message);
    MessageBox.Show("成功发送消息到队列");

    19}


    1private void DisplayMessage()
    {
    //连接到本地队列
    MessageQueue myQueue = new MessageQueue(".\private$\myQueue");
    myQueue.MessageReadPropertyFilter.Priority = true;
    DataTable messageTable = new DataTable();
    messageTable.Columns.Add("名字");
    messageTable.Columns.Add("消息内容");
    messageTable.Columns.Add("优先级");
    XmlMessageFormatter formatter = new XmlMessageFormatter(new string[] { "System.String" });
    try
    {
    //从队列中接收消息
    System.Messaging.Message[] messages = myQueue.GetAllMessages();
    for (int index = 0; index < messages.Length; index++)
    {
    messages[index].Formatter = formatter;

    string label = messages[index].Label;
    string body = messages[index].Body.ToString();
    string priority = messages[index].Priority.ToString();

    messageTable.Rows.Add(new string[] { label, body, priority });
    }
    this.dgvMessage.DataSource = messageTable;
    }
    catch (MessageQueueException e1)
    {
    MessageBox.Show(e1.Message);
    }
    }
    }

    注:要完成以上应用还需注意一点,由于消息的优先级是枚举类型,在直接messages[index].Priority.ToString();这种方式来获取优先级转化到字符串的时候,他需要一个过滤器(Filter),否则会抛出一个InvalidCastExceptionle类型的异常,异常信息"接收消息时未检索到属性 Priority。请确保正确设置了 PropertyFilter。",要解决这问题只需要把消息对象的MessageReadPropertyFilter(过滤器) 的Priority设置为true就OK了。见上面代码里!^.^

    1// 摘要:

    2// 指定消息队列在消息传递到队列的过程中应用于该消息的优先级,以及指定何时将消息插入目标队列。

    3public enum MessagePriority

    4{
    // 摘要:
    // 最低消息优先级。
    Lowest = 0,
    //
    // 摘要:
    // 位于 Low 和 Lowest 消息优先级之间。
    VeryLow = 1,
    //
    // 摘要:
    // 低消息优先级。
    Low = 2,
    //
    // 摘要:
    // 普通消息优先级。
    Normal = 3,
    //
    // 摘要:
    // 位于 System.Messaging.MessagePriority.High 和 System.Messaging.MessagePriority.Normal
    // 消息优先级之间。
    AboveNormal = 4,
    //
    // 摘要:
    // 高消息优先级。
    High = 5,
    //
    // 摘要:
    // 位于 Highest 和 High 消息优先级之间。
    VeryHigh = 6,
    //
    // 摘要:
    // 最高消息优先级。
    Highest = 7,

    37}

  • 相关阅读:
    【NOI D2T1】量子通信(容斥原理+卡常)
    CF1555D Say No to Palindromes(线段树)
    CF1554B Cobb
    CF1554A Cherry
    【做题笔记】UVA10162 Last Digit
    【做题记录】CF1223D Sequence Sorting
    CF39H
    UVA10763
    题解 AT2361 [AGC012A] AtCoder Group Contest
    このブログについて | About this blog
  • 原文地址:https://www.cnblogs.com/mmbbflyer/p/7773206.html
Copyright © 2011-2022 走看看