跳到主要内容

有序关机

QWen Plus 中英对照 Orderly Shutdown

如 “MBean Exporter” 所述,MBean 导出器提供了一个名为 stopActiveComponents 的 JMX 操作,该操作用于以有序的方式停止应用程序。该操作有一个 Long 类型的参数。该参数表示操作等待以允许正在进行的消息完成的时间长度(以毫秒为单位)。该操作的工作原理如下:

  1. 调用所有实现了 OrderlyShutdownCapable 的 bean 的 beforeShutdown() 方法。

    这样可以让这些组件为关闭做准备。实现此接口的组件示例及其在此调用中所做的工作包括:停止其侦听容器的 JMS 和 AMQP 消息驱动适配器、停止接受新连接(同时保持现有连接打开)的 TCP 服务器连接工厂、丢弃(记录)任何新接收消息的 TCP 输入端点,以及对任何新请求返回 503 - Service Unavailable 的 HTTP 输入端点。

  2. 停止任何活动的通道,例如由 JMS 或 AMQP 支持的通道。

  3. 停止所有 MessageSource 实例。

  4. 停止所有传入的 MessageProducer(那些不是 OrderlyShutdownCapable 的)。

  5. 等待剩余的时间,如操作中传入的 Long 参数值所定义的那样。

    这样可以让任何在途消息完成它们的旅程。因此,在调用此操作时选择适当的超时非常重要。

  6. 调用所有 OrderlyShutdownCapable 组件的 afterShutdown() 方法。

    这样可以让这些组件执行最终的关闭任务(例如关闭所有打开的套接字)。

有序关闭管理操作 中所述,可以通过使用 JMX 来调用此操作。如果您希望以编程方式调用该方法,则需要注入或以其他方式获取 IntegrationMBeanExporter 的引用。如果在 <int-jmx:mbean-export/> 定义中未提供 id 属性,则该 bean 具有生成的名称。此名称包含一个随机组件,以避免在同一个 JVM 中存在多个 Spring Integration 上下文时发生 ObjectName 冲突(MBeanServer)。

因此,如果你想以编程方式调用该方法,我们建议你为导出器提供一个 id 属性,这样你可以轻松地在应用程序上下文中访问它。

最后,可以通过使用 <control-bus> 元素来调用操作。详情请参阅 监控 Spring Integration 示例应用程序

备注

在 4.1 版中,前面描述的算法得到了改进。以前,所有任务执行器和调度程序都会停止。这可能会导致 QueueChannel 实例中的中途消息保留下来。现在关闭时轮询器保持运行,以使这些消息能够被清除和处理。