在MSMQ中,有一项功能可以让用户在不实际使用消息的情况下查看消息。即我根据MessageID查看队列中的下一条消息。如果我对消息不感兴趣,我可以将消息放回队列中(即未确认将被添加回队列并保持messageID)。
RabbitMQ中也存在类似的功能。但是在RabbitMQ中,它并没有以干净的方式完成。您可以通过从队列中取消消息然后不发送确认来模拟偷看消息,以便RabbitMQ将该消息添加回队列。但是我读到,当未确认的消息重新添加到队列时,RabbitMQ可以重新排序消息并增加消息ID。
之前有没有人遇到过这个问题。
也有人知道IBM MQ是否支持peek和seek的行为/功能?
问候 d
答案 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