【问题标题】:Can I compare with the current date for a JMS message selector?我可以与 JMS 消息选择器的当前日期进行比较吗?
【发布时间】:2017-04-07 11:04:09
【问题描述】:

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

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

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

【问题讨论】:

  • 你有没有想过这个问题。答案是不是,你不能在选择器中使用这种比较语法?

标签: jms tibco-ems


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 对,所以问题的重点是我如何与当前时间进行比较,而不是某个预定义的时间..
      【解决方案4】:

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

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

      【讨论】:

      • 您可能需要提供一些代码来展示如何进行比较
      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多