3

在 MSMQ 中,有一个功能可以让用户在不实际使用的情况下查看消息。即,我根据 MessageID 查看队列中的下一条消息。如果我对消息不感兴趣,我可以将消息放回队列(即将未确认的消息添加回队列并保留 messageID)。

RabbitMQ 中也存在类似的功能。然而,在 RabbitMQ 中,它并没有以干净的方式完成。您可以通过将消息从队列中取出然后不发送确认来模拟查看消息,这样 RabbitMQ 就会将该消息添加回队列。但是我读到当未确认的消息重新添加到队列中时,RabbitMQ 可以重新排序消息并增加消息 ID。

有没有人遇到过这个问题。

还有人知道 IBM MQ 是否支持这种偷看和搜索的行为/功能吗?

问候 D

4

2 回答 2

3

IBM MQ 提供了一种浏览消息的方法,而无需将它们从队列中移除。您可以从头开始浏览消息并遍历队列中的所有消息。您还可以使用 MessageId 或 CorrelationId 浏览特定消息。

这是 C# 中用于浏览队列中消息的片段。

    /// <summary>
    /// Browse messages in a queue
    /// </summary>
    private void BrowseMessages()
    {
        MQQueueManager qm = null;
        MQQueue queueGet = null;
        Hashtable mqProps = null;

        try
        {
            mqProps = new Hashtable();
            // Setup properties for connection
            mqProps.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
            mqProps.Add(MQC.HOST_NAME_PROPERTY, "localhost");
            mqProps.Add(MQC.PORT_PROPERTY, 1414);
            mqProps.Add(MQC.CHANNEL_PROPERTY, "QM.SVRCONN");

            // Open connection to queue manager
            qm = new MQQueueManager("QM", mqProps);

            // Open queue for browsing
            queueGet = qm.AccessQueue("Q1", MQC.MQOO_BROWSE | MQC.MQOO_FAIL_IF_QUIESCING);

            // In a loop browse all messages till we reach end of queue
            while (true)
            {
                try
                {
                    // Need to create objects everytime
                    MQMessage msg = new MQMessage();
                    MQGetMessageOptions gmo = new MQGetMessageOptions();

                    // Use browse next option to start browsing
                    gmo.Options = MQC.MQGMO_BROWSE_NEXT;
                    queueGet.Get(msg, gmo);
                    Console.WriteLine(msg.ReadString(msg.MessageLength));
                }
                catch (MQException mqex)
                {
                    // When there are no more messages to browse, the Get call
                    // will throw MQException with reason code MQC.MQRC_NO_MSG_AVAILABLE.
                    // But here we close the queue and break out of loop for all exceptions
                    queueGet.Close();
                    break;
                }
            }
            qm.Disconnect();
        }
        catch (MQException mqex)
        {
            Console.WriteLine(mqex);
        }
    }
于 2015-05-22T15:18:20.187 回答
2

在 IBM MQ 中,查看队列上的消息(如果它们不是太大)的一种方法是 amqsbcg 示例程序(如 Tim 所述浏览)。您可以使用它来将消息转储到输出文件,而无需执行破坏性获取。然后,您可以解析该文件以检查您需要的消息 ID 或其他信息。如果您发现一条消息符合您需要的条件,那么您必须使用这些选项执行 GET 以将其从队列中实际删除。

amqsbcg QUEUENAME QMGRNAME > output.file

这个示例程序可以在

AIX/Unix: $MQ_HOME/samp/bin/amqsbcg
Windows: $MQ_HOME\tools\c\Samples\Bin\amqsbcg.exe

其中 $MQ_HOME 是您的操作系统的适当位置。$MQ_HOME 的默认位置是:

AIX:/usr/mqm

Unix:/opt/mqm

Windows:C:\Program Files\IBM\Websphere MQ

另一个可能的选项可能是“qload”MO03 支持包。它有一个选项让您按消息 ID、CorrelId Id 或组 ID 进行过滤

http://www-01.ibm.com/support/docview.wss?acss=wmq062007&rs=171&uid=swg24009368

于 2015-05-20T11:40:16.587 回答