【问题标题】:How to clear messages from a JMS Topic based on age of messages如何根据消息的年龄从 JMS 主题中清除消息
【发布时间】:2019-12-06 10:10:30
【问题描述】:

我们有一个将事件通知发布到 JMS 主题的应用程序。这里注意到的问题是,经过相当长的一段时间后,Weblogic 中的消息存储达到了 10GB 以上的大小。有没有办法实现一个组件,该组件可以从 JMS 主题中删除超过一定期限(比如 30 天)的消息?

当前有一个进程,在停机活动期间,消息存储被删除。但是,该过程需要订阅应用程序的所有者进行先决条件检查,以确定是否已处理基于最后一条消息的操作。

谢谢

【问题讨论】:

    标签: jms jms-topic autoflush


    【解决方案1】:

    JMS 主题的消息累积表​​明至少有一个不活动的持久订阅或可能慢 订阅消费者。一般来说,您可以通过移除不活动的持久订阅、加快慢速订阅消费者、减慢消息生产以便消费者跟上等等来防止这种情况发生。

    如果您不想保留超过 30 天的消息,则可以尝试使用 JMS 规范定义的“消息生存时间”功能。 JMS 1.1 规范的第 4.8 节指出:

    客户端可以为它的每条消息指定一个以毫秒为单位的生存时间值 发送。这个值定义了一个消息过期时间,它是 消息的生存时间和发送的 GMT(对于事务发送,这是 客户端发送消息的时间,而不是事务提交的时间)。

    JMS 提供者应尽最大努力准确地使消息过期;然而,JMS 没有定义所提供的准确性。简单地忽视是不可接受的 生存时间。

    有关消息过期的更多信息,请参阅第 3.4.9 节 “JMS过期。”

    当使用javax.jms.MessageProducer.setTimeToLive(long) 或重载的send() 方法之一发送消息时,可以设置消息的生存时间。当然,这需要更改发送应用程序的代码。

    许多代理支持在代理上设置消息的生存时间或过期时间,这样客户端修改就不是绝对必要的。我对 Weblogic 不够熟悉,不知道它是否支持此功能,但如果您想使用此解决方案并且不想修改您的客户端,则值得调查。

    【讨论】:

      【解决方案2】:

      遇到以下代码,可以通过浏览队列来帮助清除消息。

      queue browser

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-20
        • 2013-09-30
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2011-12-12
        相关资源
        最近更新 更多