我们有一个将事件通知发布到 JMS 主题的应用程序。这里注意到的问题是,经过相当长的一段时间后,Weblogic 中的消息存储达到了 10GB 以上的大小。有没有一种方法可以实现一个组件,该组件可以从 JMS 主题中删除超过一定年龄(比如 30 天)的消息?
当前到位的是一个过程,在停机活动期间,消息存储被删除。然而,该过程具有来自订阅应用程序所有者的先决条件检查,是否已处理基于最后一条消息的操作。
谢谢
JMS 主题的消息累积表明至少有一个不活动的持久订阅或者可能是缓慢的订阅消费者。一般来说,您可以通过删除不活动的持久订阅、加快慢速订阅消费者、减慢消息生产以便消费者跟上等方式来防止这种情况发生。
如果您不想保留超过 30 天的消息,则可以尝试使用 JMS 规范定义的“消息生存时间”功能。JMS 1.1 规范的第 4.8 节指出:
客户端可以为其发送的每条消息指定一个以毫秒为单位的生存时间值。这个值定义了一个消息过期时间,它是消息的生存时间和它发送的 GMT 的总和(对于事务发送,这是客户端发送消息的时间,而不是事务提交的时间)。
JMS 提供者应该尽最大努力准确地使消息过期;但是,JMS 没有定义所提供的准确性。简单地忽略生存时间是不可接受的。
有关消息过期的更多信息,请参阅第 3.4.9 节“JMSExpiration”。
javax.jms.MessageProducer.setTimeToLive(long)
当使用任一重载方法或其中一个重载方法发送消息时,可以设置消息的生存时间send()
。当然,这需要更改发送应用程序的代码。
许多代理支持在代理上设置消息的生存时间或到期时间,这样客户端修改就不是绝对必要的。我对 Weblogic 不够熟悉,不知道它是否支持此功能,但如果您想使用此解决方案并且不想修改您的客户端,则值得调查。
遇到以下代码,它可以帮助通过浏览队列来清除消息。