我可以与 JMS 消息选择器的当前日期进行比较吗?



我想将消息放入具有日期/时间作为消息属性的队列中,并在该属性满足与当前日期相关的条件时从队列中提取消息。

例如,假设我想在 3:00 使用消息。我的想法是将属性设置为 3:00,然后有一个消息选择器,如 event_timestamp <= CURRENT_TIMESTAMP .

我知道 JMS API 的消息选择器是基于 SQL 的,所以我想以查询数据库的方式使用它,其中我可能有一个关键字,如 CURRENT_TIMESTAMPNOW() 等。消息选择器表达式语法中是否有类似的内容,或者实现这种结果的另一种方法?

据我所知,JMS规范中没有可用于选择器的函数。也许有些存在于供应商特定的实现扩展中,但根据消息选择器参考,tibco 中不存在。

由于消息选择器是特定MessageConsumer的固定参数,你必须用当前日期(或其他任何日期)制作你的selector字符串,并在每次选择器查询更改时调用Session.createConsumerSession.createDurableSubscriberSession.createBrowser

我建议您为所有使用者保持相同的连接和会话,以保持合理的性能。

另一种选择是使用消息浏览器打开消息的属性来计算您的条件,然后决定在匹配时有效地使用它,但这个想法绝对是一个常规的轮询,它打破了消息传递哲学。

我猜您在定义的时间戳之后发布一条消息以供将来处理。也许还有另一种方法可以实现您的要求,这要归功于消息过期。通常,可以将代理配置为将过期的消息从队列 A 移动到另一个队列 B,因此它为您完成工作:您的使用者仅在队列 B 过期后侦听队列 B 上可用的消息。

如果您的服务器符合 JMS 2.0 标准,请使用传递延迟功能:JMSProducer.setDeliveryDelay(long deliveryDelay)
当您将消息放入队列时,计算延迟到所需时间。
延迟到期时,消息将变为"可见"JMS 2.0 新功能

任何内容都可以放入消息的用户定义属性中。例如,用户属性MyTimeStamp和属性的值设置为 3.00 ,然后您可以使用选择器,您可以在其中将选择器设置为MyTimeStamp='3.00'。消息将在到达队列后立即传递给等待的使用者。这并不意味着消息将在系统时间为下午 3 点时传递给使用者。

您可以使用 JMSTimestamp,它是 Unix 时间/纪元时间(自 1970 年以来 #seconds)。这是一个很长。

我没有尝试过这个,但这似乎很容易。

最新更新