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

时间:2012-04-24 23:07:43

标签: jms tibco-ems

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

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

我理解JMS API的消息选择器基于SQL,所以我想以查询数据库的方式使用它,我可能会在其中使用CURRENT_TIMESTAMP或{{1}这样的关键字等等。消息选择器表达式语法中是否有类似的内容,或者是另一种实现此类结果的方法?

4 个答案:

答案 0 :(得分:2)

据我所知,JMS规范中没有可用于选择器的函数。根据{{​​3}},可能有一些存在于供应商特定的实现扩展中,但不存在于tibco中。

由于消息选择器是特定MessageConsumer的固定参数,因此您必须使用当前日期(或其他)制作selector字符串并致电the message selector reference,{{1}每次此选择器查询更改时,或Session.createDurableSubscriber

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

另一个选择是使用消息浏览器打开消息的属性来计算你的状况,然后决定如果它匹配就有效地使用它,但这个想法绝对是一个定期的轮询,它打破了消息传递理念。

我猜你在定义的时间戳之后发布消息以便将来处理。由于消息过期,可能还有另一种方法来实现您的需求。通常,可以将代理配置为将过期的消息从队列A移动到另一个队列B,因此它可以为您完成任务:您的消费者只是在其到期后才侦听队列B上可用的消息。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用在Unix时间/纪元时间内的JMSTimestamp(自1970年以来的#seconds)。这很长。

我没试过,但看起来很容易。