有序关闭

如“MBean 导出器”中所述,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 (MBeanServer) 中存在多个 Spring Integration 上下文时出现 ObjectName 冲突。

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

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

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