使用IBM MQ,我如何获得消息到达队列的确切时间?

时间:2016-09-27 16:02:15

标签: jms ibm-mq

在接收方,我需要知道消息留在队列中多久才能进行处理。

我正在使用Java和JMS。

2 个答案:

答案 0 :(得分:1)

进一步搜索后,我在此论坛中发现了一篇类似讨论的帖子: http://www.mqseries.net/phpBB2/viewtopic.php?t=71092&sid=97f90533407247be7150d81d550538a1

这是一个复杂的解决方案,但它似乎是知道某个传入消息何时被有效接收的唯一方法。

它涉及设置一个处理传出消息的退出程序,如果是COA,则将当前时间戳(使用messageId / correlationId)保存到某处以供以后处理。

但最大的问题是:为什么IBM首先没有实施“到货时间戳”属性?这看起来很简单...

答案 1 :(得分:0)

您可以访问JMS_IBM_MQMD_PutDateJMS_IBM_MQMD_PutTime属性 - 请参阅WMQ documentation。请记住,这是将消息放入原始队列的时间 - 当消息传递到队列管理器时,此时间戳不会更改。

如果您不能直接使用这些属性 - 要么您不能信任它们,要么/并且您只想跟踪本地PUT时间戳 - 那么您没有太多选择。在我看来,最简单的方法是在同一个节点上有一个简单的中间程序,将消息从队列中取出并将它放在另一个你将实际服务的队列上。只要您只关心有效负载而不关心消息上下文,这个简单的设置就可以了。如果你确实需要继承某些上下文,例如原始用户ID,那么你将需要使用SET _ * _ CONTEXT选项(以及正确的授权)。如果你不喜欢中间程序的想法,我想你的最后一个手段是一个频道在接收方退出,但在大多数情况下,这是相当大的。

完全不同 - 根据您的实际要求,您可能会发现,不是跟踪每条消息在队列上花费的时间,而是使用MQ性能事件,特别是queue service interval event以确保您保留足够快地为输入队列提供服务。如果服务间隔超过您的阈值,您可以采取纠正措施。