【问题标题】:JMS message expiry not workingJMS 消息过期不起作用
【发布时间】:2017-01-10 10:59:18
【问题描述】:

我需要在 JMS 主题中为我的消息设置消息过期。我尝试通过设置 message.setJMSExpiration() 和 producer.getTimeToLive() 方法的属性。但我不这么认为,我在我发布的主题中发布的消息仍然存在。

我的疑问是这些属性是否用于在过期时间到达后丢弃主题中的未订阅消息?或在特定订阅者订阅的消息之后。

我使用选择器来识别特定的客户。

如果上述任何一个属性都不足以使消息过期,那么我是否需要任何其他配置才能使消息在生产者端过期?

我正在使用 Apache ActiveMQ 5.8.0 和 JDK 1.6

【问题讨论】:

    标签: java jms activemq jms-topic


    【解决方案1】:

    我的两分钱信息。希望这可以帮助您确定您遇到的问题。

    有两种类型的订阅,持久订阅和非持久订阅,订阅者(或创建订阅的应用程序)分别称为持久订阅者和非持久订阅者。

    只要应用程序正在运行,非持久订阅者就会收到发布。即使接收应用程序未运行,持久订阅也会接收发布。持久订阅由存储(通常是队列)提供支持,并且消息传递提供程序在应用程序未运行时将发布内容放入存储中。

    如果没有订阅主题,消息提供者将简单地丢弃该发布。

    Message Expiry (a.k.a TimeToLive) 适用于这两种类型的订阅。如果订阅者应用程序在到期前没有收到消息,则这些消息将过期并且不会传递给接收应用程序。

    消息只有在生产者发布到消息提供者后才能过期。

    【讨论】:

    • 感谢您的回答。但这是我在互联网上浏览一些文章的理论。正如你所说,我只应用了持久订阅。因为我担心我的客户不会错过生产者发布的任何消息。我主要担心的是,当我的客户端长时间没有运行时,发布者必须使消息过期,因为客户端没有运行日志时间。在这种情况下,如果订阅者不订阅消息,我如何告诉发布者在这么长时间后使消息过期。
    • 您在说两件事 - (1) 客户端不应错过任何消息和 (2) 消息应在一段时间后过期 - 两者相互矛盾。如果您设置了过期并且客户端在过期时间内没有恢复,那么客户端将错过该发布。无论如何,在发布者端,您需要在发布消息之前设置消息的到期时间。消息提供者将在过期时间结束后丢弃消息。
    • 在我看来,客户端不应该错过任何消息,直到消息过期。因为一些安全问题。在到期时间内,如果客户端开始订阅,那么获取消息没有问题。所以我尝试在发布者端设置到期时间。
    【解决方案2】:

    1) 根据 JMS 规范,所有 QoS 设置(持久性、到期(aka TTL)和优先级必须在 Producer 对象上设置。在 Message 对象上设置时,它们将被忽略。

    2) 需要查看客户端代码来验证 TTL 的值是否设置正确。

    3) TTL 值是以毫秒为单位的消息过期时间(即 300000 为 5 分钟),而不是从 EPOCH 开始的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2011-12-22
      • 1970-01-01
      • 2020-03-18
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多