【发布时间】:2023-03-15 00:38:01
【问题描述】:
我有一个需求,我将数据发布到 IBM MQ,并在晚上 10 点左右运行一个调度程序,该调度程序应该只使用那些在晚上 10 点之前发布的消息。晚上 10 点或之后发布的消息应该在第二天被挑选出来。
IBM MQ 中有没有一种方法可以根据日期时间过滤并使用它?有什么建议吗?
提前致谢。
【问题讨论】:
我有一个需求,我将数据发布到 IBM MQ,并在晚上 10 点左右运行一个调度程序,该调度程序应该只使用那些在晚上 10 点之前发布的消息。晚上 10 点或之后发布的消息应该在第二天被挑选出来。
IBM MQ 中有没有一种方法可以根据日期时间过滤并使用它?有什么建议吗?
提前致谢。
【问题讨论】:
你真正想做的是使用这样的消息选择器:-
Root.MQMD.PutDate = '20210924' AND Root.MQMD.PutTime < '22000000'
但是,不幸的是,您可以对字符串使用的唯一运算符(并且这两个字段都是字符串字段)是 = 和 <>(不等于)(请参阅 IBM MQ Docs: Message selector syntax)。
或者,您可以使用 QLOAD,它可以根据时间选择消息,并通过将您应该处理的所有消息移动到另一个队列来预处理队列,然后允许您的应用程序在整个队列上工作.您可以按如下方式调用 QLOAD:-
qload -m QM1 -i INPUT.Q -Tt22:00 -o APPL.INPUT.Q
此命令将从名为 INPUT.Q 的队列中读取消息,并且只会将今天 22:00(晚上 10 点)之前放入的消息移动到名为 APPL.INPUT.Q 的队列中。
当然,QLOAD 在这里没有做任何您无法写入自己的应用程序的事情。只需检查MQMD 中的PutDate 和PutTime 字段,并使用它们来决定是否处理消息。
【讨论】:
您可以尝试在侦听器中使用选择器表达式来按时间进行过滤。
这是一个改编自documentation 的示例,说明如何使用选择器表达式:
<flow name="JMSConnectorPublish">
<jms:listener config-ref="JMS_Config" destination="in" selector="JMSPriority=9"/>
</flow>
它不使用时间。您需要熟悉 IBM MQ/JMS 消息的标头和属性才能找到正确的表达式。您可能会对attributes.headers.JMSTimestamp 感兴趣。
【讨论】: