【问题标题】:Need to get Oldest MQMessage From MQQueue需要从 MQQueue 获取最旧的 MQMessage
【发布时间】:2011-02-19 10:22:02
【问题描述】:

您好,我是 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,但这可能不是队列中最旧的消息。我对此一无所知。请帮我看看有没有办法得到那个。

【问题讨论】:

    标签: jsp monitoring messaging ibm-mq


    【解决方案1】:

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

    使用按优先级排序的消息面临的困难是您可以忽略较低优先级但不能忽略较高优先级。例如,如果您在浏览器中指定优先级为 5,并且任何消息的优先级为 4 或更低,则它们将不会被返回。但是将返回消息或更高优先级的消息,而不仅仅是优先级 5 消息,而是优先级 9 消息,然后是优先级 8 消息,依此类推。因此,如果队列传递顺序设置为优先级。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多