【问题标题】:Getting Message by priority from MSMQ从 MSMQ 按优先级获取消息
【发布时间】:2010-11-21 13:51:59
【问题描述】:

我通过设置优先级在 MSMQ 中发送消息。使用 C#

我可以先从具有高优先级的 MSMQ 获取消息吗?

就像我们进入优先队列一样。

还有一件事..

假设有三个优先级

0 - 高 1- 中等 2 - 低

队列中的序列是2001122221111100

现在,如果我发送具有高优先级(0)的消息,它将被放置在哪里?通过在 MSMQ 中设置优先级。它的行为会像实际的优先级队列一样吗?

【问题讨论】:

    标签: .net msmq priority-queue


    【解决方案1】:

    MSMQ 确实支持消息的优先级排队,但是相同优先级的消息在出队时按到达顺序进行处理。例如,如果您发送 3 条消息,两条优先级 7 和一条优先级 0,那么收到的第一个优先级为 7 的消息将出列,然后是收到的第二个优先级为 7 的消息,最后是优先级 0。您不必做任何特殊的事情来按优先级顺序处理排队的消息...但是请注意,任何给定优先级的“最旧”消息将在具有相同优先级的“最新”消息之前出列。还应注意,任何事务性消息都会忽略其优先级 IIRC。

    编辑:

    虽然 MSMQ 支持优先级,但它的行为与优先级队列不同。两者是不同的算法,MSMQ 要复杂得多。当您设置消息的优先级时,帮助 不仅决定了该消息出队的顺序,它还影响该消息通过 MSMQ 服务从发件人/发布者到接收者/订阅者。假设您使用三个最低优先级(MSMQ 支持 8 个优先级,从 0(最低)到 7(最高)),可能会出现以下情况:

    0 = 低,1 = 中,2 = 高

    发送者在指定的时间(分:秒)发送具有给定优先级的消息:

    0 @ 1:00  
    2 @ 1:00
    0 @ 1:01
    1 @ 1:02
    1 @ 1:03
    0 @ 2:01
    2 @ 2:01
    

    接收方按以下顺序在其队列中排队消息(假设没有消息出队):

    2 @ 1:00
    2 @ 2:01
    1 @ 1:02
    1 @ 1:03
    0 @ 1:00
    0 @ 1:01
    0 @ 2:01
    

    当您处理接收者队列中的消息时,它们将按照优先级顺序以及接收时间进行处理。

    【讨论】:

    • 假设有两个消息低,高,并且有一个“最高”优先级的新消息。它将被放置在哪里?这条消息会先出队吗?
    • 根据您编辑的问题,我认为您的优先级值向后。在 MSMQ 中,优先级数越高,优先级越高。这将使 0 = 低,1 = 中,2 = 高。如果您想要一个额外的“最高”优先级,您将拥有 3 = 最高。如果一条消息以优先级 3(最高)进入,则它应该首先出列,然后是具有其他三个列出的优先级中的任何一个的任何其他消息。
    • 最后说明...MSMQ 的行为永远不会完全像优先级队列。优先级队列是一种比 MSMQ 的消息排序简单得多的算法。有关 MSMQ 如何处理等待出队的消息的更好描述,请参阅我的更新答案。
    • 您还应该注意事务性消息始终具有低 (0) 优先级,如 MSDN 的备注部分所述:msdn.microsoft.com/en-us/library/6d378t8s.aspx#remarksToggle
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2015-02-11
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多