我想将消息放入具有日期/时间作为消息属性的队列,并在该属性满足与当前日期相关的条件时从队列中提取消息。
例如,假设我想在3:00消费该消息。我的想法是将属性设置为3:00,然后有一个消息选择器,如event_timestamp <= CURRENT_TIMESTAMP
。
我理解JMS API的消息选择器基于SQL,所以我想以查询数据库的方式使用它,我可能会在其中使用CURRENT_TIMESTAMP
或{{1}这样的关键字等等。消息选择器表达式语法中是否有类似的内容,或者是另一种实现此类结果的方法?
答案 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)。这很长。
我没试过,但看起来很容易。