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

时间:2019-07-29 05:20:19

标签: jms jms-topic autoflush

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

针对JMS主题的消息累积表​​明至少有一个非活动的持久订阅或 slow 订阅使用者。通常,您可以通过以下方法来防止这种情况:删除不活动的持久订阅,加快慢速订阅用户的速度,减慢消息生成的速度,以便用户可以继续使用等。

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

  

客户端可以为其每条消息指定生存时间(以毫秒为单位)   发送。此值定义消息的过期时间,该时间是   邮件的生存时间和发送的格林尼治标准时间(对于已发送的邮件,这是   客户端发送消息的时间,而不是事务提交的时间。

     

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

     

有关消息到期的更多信息,请参见第3.4.9节   “ JMSExpiration。”

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

许多代理支持在代理上设置消息的生存时间或到期时间,因此不必严格要求修改客户端。我对Weblogic尚不熟悉,无法知道它是否支持此功能,但是值得调查一下是否要使用此解决方案并且不想修改客户端。

答案 1 :(得分:0)

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

queue browser