消息在IBM MQ中查看

时间:2015-05-19 11:51:13

标签: rabbitmq msmq ibm-mq mq peekmessage

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

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

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

也有人知道IBM MQ是否支持peek和seek的行为/功能?

问候 d

2 个答案:

答案 0 :(得分: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);
        }
    }

答案 1 :(得分: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

另一种可能的选择可能是&#34; qload&#34; MO03支持pac。它可以让您按消息ID,CorrelId Id或Group Id

进行过滤

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