如何根据消息年龄从 JMS 主题中清除消息

How to clear messages from a JMS Topic based on age of messages

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

当前是一个进程,停机期间activity消息存储被删除。但是,该过程有来自订阅应用程序所有者的先决条件检查是否已处理基于上一条消息的操作。

谢谢

JMS 主题的消息累积表​​示至少有一个不活动的持久订阅或可能 慢速 订阅消费者。通常,您可以通过删除不活动的持久订阅、加速慢速订阅消费者、减慢消息生成速度以便消费者跟上等方式来防止这种情况。

如果您不想保留超过 30 天的消息,那么您可以尝试使用 JMS 规范定义的 "Message Time-To-Live" 功能。 JMS 1.1 规范的第 4.8 节指出:

A client can specify a time-to-live value in milliseconds for each message it sends. This value defines a message expiration time that is the sum of the message’s time-to-live and the GMT it is sent (for transacted sends, this is the time the client sends the message, not the time the transaction is committed).

A JMS provider should do its best to expire messages accurately; however, JMS does not define the accuracy provided. It is not acceptable to simply ignore time-to-live.

For more information on message expiration, see Section 3.4.9 "JMSExpiration."

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

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

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

queue browser