Orderly Shutdown

如 "MBean Exporter" 中所述,MBean 导出器提供一个名为 `stopActiveComponents`的 JMX 操作,用于以有序方式停止应用程序。该操作有一个 `Long`参数。该参数表示该操作等待以完成正在传输消息所需的时间(以毫秒为单位)。操作方法如下:

  1. 对所有实现 OrderlyShutdownCapable`的 Bean 调用 `beforeShutdown()。这样做可以使此类组件为关闭做准备。实现此接口的组件及其使用此调用的功能的示例包括:停止其侦听器容器的 JMS 和 AMQP 消息驱动的适配器、停止接受新连接(同时保持现有连接打开)的 TCP 服务器连接工厂、放弃(记录)任何接收到的新消息的 TCP 入站端点以及为任何新请求返回 “503 - 服务不可用” 的 HTTP 入站端点。

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

  3. Stop all MessageSource instances.

  4. 停止所有入站 MessageProducer (不是 OrderlyShutdownCapable)。

  5. 根据传入操作的 Long 参数值定义,等待剩余时间。这样做可以使任何正在进行的消息完成其进程。因此,在调用此操作时选择一个合适的超时非常重要。

  6. 在所有 OrderlyShutdownCapable 组件上调用 afterShutdown()。这样做可以使此类组件执行最终关闭任务(例如,关闭所有打开的套接字)。

Orderly Shutdown Managed Operation中所述,该操作可以通过使用 JMX 来调用。如果您希望以编程方式调用方法,您需要注入 IntegrationMBeanExporter`或其他获得它的引用。如果未在 `<int-jmx:mbean-export/>`定义中提供 `id`特性,则该 bean 有一个生成名称。该名称中包含一个随机组件,以避免如果同一个 JVM 中有多个 Spring Integration 上下文 (`MBeanServer),出现 `ObjectName`冲突。

因此,如果你希望通过编程方式调用该方法,我们建议你向该 Exporter 提供一个 “id” 属性,以便你可以在应用程序上下文中轻松访问它。

最后,可以使用 <control-bus> 元素调用该操作。有关详细信息,请参阅 monitoring Spring Integration sample application

先前改进的算法在 4.1 版本得到优化,以前所有任务执行程序和计划程序都会停止,这可能导致 QueueChannel 实例中的中间流程消息保留下来。现在,关闭会让轮询器保持运行,以便让这些消息被抽取并处理。