1

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

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

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

4

4 回答 4

3

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

由于消息选择器是特定的固定参数MessageConsumer,因此您必须selector使用当前日期(或其他)和 call 来制作字符串Session.createConsumerSession.createDurableSubscriber或者Session.createBrowser每次此选择器查询更改时。

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

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

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

于 2012-05-03T20:53:27.817 回答
2

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

于 2017-04-07T01:37:49.597 回答
0

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

于 2012-04-25T09:03:34.440 回答
0

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

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

于 2017-04-05T21:40:37.230 回答