需要从MQQueue获取最旧的MQMessage

时间:2011-02-18 07:49:54

标签: jsp monitoring messaging ibm-mq

您好我是IBM MQ的新手。这里我的要求是从MQQueue获取最旧的MQMessage,无论它们设置什么优先级,并在JSP中显示它以用于某些监视目的。在现有代码中,

qMgr = new MQQueueManager(qManager);

    int openOptions = MQC.MQOO_INQUIRE | MQC.MQOO_BROWSE|MQC.MQOO_INPUT_SHARED;
    MQQueue eventQueue = qMgr.accessQueue(qName, openOptions, null, null, null);
    MQMessage retrievedMessage = new MQMessage();   
    MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options = MQC.MQGMO_BROWSE_FIRST;
    eventQueue.get(retrievedMessage, gmo); 

这里我可以获得MQMessage,但这可能不是队列中最老的。我不知道这个。请帮助我有没有办法得到那个。

1 个答案:

答案 0 :(得分:1)

如果队列是FIFO,那么您的浏览将返回最早的消息。但是,如果队列设置为优先传递,那么您必须浏览队列,直到找到优先级最低的第一条消息。您的代码段表明这是一个事件队列。如果它指的是SYSTEM。*。EVENT队列,那么它们应该始终处于FIFO模式。即使管理员将其更改为优先级传递,也会以相同的优先级生成所有系统事件消息。

您使用优先级排序的消息所面临的困难是您可以忽略较低优先级而不是较高优先级。例如,如果您在浏览中指定优先级为5,并且任何邮件优先级为4或更低,则不会返回它们。但是将返回消息或更高优先级,而不仅仅是优先级5消息,而是优先级9消息,后面是优先级8消息,依此类推。因此,您将无法有选择地浏览每个优先级中的第一条消息,而是必须浏览,直到您找到第一条优先级为0的消息,以便知道如果队列传递顺序设置为优先级。

查看com.ibm.mq.pcf中的方法以了解如何查询队列属性可能是值得的。如果队列是FIFO,只需浏览第一条消息。如果没有,浏览队列的长度,保存从每个优先级获得的第一条消息,将时间戳与来自更高优先级的任何消息进行比较,并丢弃较新的优先级。

请注意,交易会影响您浏览邮件的能力。在同步点下保存的任何邮件都将无法用于您的浏览。将返回不在同步点下的最旧消息。

最后,如果您尝试确定队列Queue Service Interval事件的运行状况,或QStatus统计信息可能会提供您所需的内容,并避免浏览深层队列的开销。