【问题标题】:Message ordinal-number by enqueuing order按排队顺序的消息序号
【发布时间】:2014-08-23 10:33:36
【问题描述】:

我的应用程序(基于 .NET)以多线程方式从队列中获取消息,我担心我可能会以无序方式接收消息,因为一个线程可能比另一个线程更快,例如,给定以下队列状态:

[Message-5 |消息4 |消息3 |消息2 | Message-1]

在多线程操作中,msg #2 可能在 msg #1 之前到达,即使 msg #1 在队列中排在第一位,由于许多线程问题(线程时间片、线程调度等)。

在这种情况下,如果队列中的消息在入队时已经标记了序号/序列号,并且即使我以无序的方式获取消息,我仍然可以在我的应用程序中使用它们给定的序数属性对它们进行排序。

Websphere MQ 环境中实现它的任何已知机制?

【问题讨论】:

    标签: multithreading message-queue ibm-mq


    【解决方案1】:

    是的,如果原始消息有序数,那么当您收到数据时,您可以:

    使用线程安全字典:

    SortedDictionary<int,Message>
    

    【讨论】:

    • 问题是我首先需要在消息上加盖一个数字。
    • 怎么会知道命令?如果发送的数据没有任何可以识别顺序的东西,那么你也不会,如果是这种情况,那么你会希望同一个线程接收整个消息集以保证数据是连续的。
    【解决方案2】:

    如果将消息放入消息组中的队列,您可以从 MQMessage 中获取MessageSequenceNumber。 MessageSquenceNumber 可以是默认情况下将消息放入队列的顺序,也可以是由将消息放入队列的应用程序定义的顺序。

    查看MessageSequenceNumberhere了解更多详情

    【讨论】:

    【解决方案3】:

    你有两个选择:

    (1) 在 MQ 中使用消息分组,如 whitfiea 所述或

    (2) 将您的应用程序更改为单线程。

    注意:如果发送应用程序未设置 MQMD MsgId 字段,则队列管理器将生成一个唯一编号(基于队列管理器名称、日期和时间)并将其存储在消息的 MQMD MsgID 字段中。

    【讨论】:

    • 谢谢解答,如果我用邮件的timestamp属性,难道还不够好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-07-30
    • 2011-06-14
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多