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