跳到主要内容
版本:7.0.2

有序关闭

DeepSeek V3 中英对照 Orderly Shutdown

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

  1. 在所有实现了 OrderlyShutdownCapable 接口的 Bean 上调用 beforeShutdown() 方法。

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

  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 实例中的流程中消息被保留。现在,关闭操作会让轮询器继续运行,以便这些消息能够被清空并处理。