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