有序关闭

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

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

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

前面描述的算法在 4.1 版本中得到了改进。以前,所有任务执行器和调度器都被停止。这会导致 QueueChannel 实例中的中间流消息保留下来。现在,关闭操作会让轮询器继续运行,以便让这些消息被清空和处理。