有序关机

如同"MBean Exporter"中所述,MBean exporter 提供了一个名为 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() 方法。

    这样做可以让这些组件执行最终的关机任务(例如,关闭所有打开的 socket)。

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

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

最后,可以使用 <control-bus> 元素调用此操作。有关详细信息,请参阅监控 Spring Integration 示例应用

上述算法在 4.1 版本中得到了改进。之前,所有的任务执行器和调度器都会停止。这可能导致 QueueChannel 实例中的流程中间消息被滞留。现在的关机过程会保持轮询器运行,以允许这些消息被消耗和处理。