我的Java应用程序不断地将JMS发送到队列,但有时JMS使用者应用程序会停止接收JMS。它会导致JMS队列非常大甚至是满的,从而使服务器崩溃。我的服务器是JBoss或Websphere。应用服务器是否提供了删除“超时”JMS消息的策略?
处理大型JMS队列的策略是什么?谢谢!
发布于 2011-01-26 21:20:17
对于任何异步消息传递,您都必须处理“快速生产者/缓慢消费者”问题。有很多方法可以解决这个问题。
成功实现其中任何一个的关键是允许您的系统提供应用程序将响应的“软”错误。例如,许多商店会在第一次获得QFULL条件时引发队列的MAXDEPTH参数。如果队列深度超过底层文件系统的大小,结果是文件系统填满并影响整个节点,而不是影响单个队列的“软”错误。您最好调优系统,使队列在文件系统填满之前就命中MAXDEPTH,然后检测应用程序或其他进程,以某种方式对整个队列做出反应。
但是不管你做了什么,上面的选项4都是强制性的。无论您分配了多少磁盘,部署了多少消费者实例,或者消息过期的速度有多快,您的消费者总是有可能跟不上消息生产的步伐。当这种情况发生时,你的生产者应用程序应该减速,或者发出警报并停止,或者做任何事情,而不是挂起或死亡。异步消息传递只有在消息队列空间耗尽时才是异步的。在那之后,你的应用程序是同步的,必须优雅地处理这种情况,即使这意味着(优雅地)关闭自己。
发布于 2011-01-26 20:12:36
好的!
http://download.oracle.com/docs/cd/E17802_01/products/products/jms/javadoc-102a/index.html Message#setJMSExpiration(long)完全符合您的要求。
https://stackoverflow.com/questions/4804374
复制相似问题