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