如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

有序关闭

正如“MBean 导出器”中所述,MBean 导出器提供了一个名为 stopActiveComponents 的 JMX 操作,用于以有序方式停止应用程序。 该操作包含一个 Long 参数。 该参数指示操作等待多长时间(以毫秒为单位),以便让进行中的消息完成。 该操作的执行方式如下:spring-doc.cadn.net.cn

  1. 对所有实现OrderlyShutdownCapable的 Bean 调用beforeShutdown()spring-doc.cadn.net.cn

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

  2. 停止任何活动通道,例如由 JMS 或 AMQP 支持的通道。spring-doc.cadn.net.cn

  3. 停止所有 MessageSource 实例。spring-doc.cadn.net.cn

  4. 停止所有入站 MessageProducers(那些不是 OrderlyShutdownCapable 的)。spring-doc.cadn.net.cn

  5. 等待剩余时间,该时间由传递给操作的 Long 参数的值定义。spring-doc.cadn.net.cn

    这样做可以让所有进行中的消息完成它们的旅程。 因此,在调用此操作时选择适当的超时时间非常重要。spring-doc.cadn.net.cn

  6. 在所有 OrderlyShutdownCapable 组件上调用 afterShutdown()spring-doc.cadn.net.cn

    这样做可以让这些组件执行最终的关闭任务(例如,关闭所有打开的套接字)。spring-doc.cadn.net.cn

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

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

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

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