有序关机
如同"MBean Exporter"中所述,MBean exporter 提供了一个名为 stopActiveComponents
的 JMX 操作,用于有序地停止应用程序。该操作接受一个 Long
类型的参数,表示操作等待进行中消息完成的时间(毫秒)。该操作的工作流程如下:
-
调用实现
OrderlyShutdownCapable
接口的所有 bean 的beforeShutdown()
方法。这样做可以让这些组件为关机做准备。实现此接口并在调用此方法时执行操作的组件示例包括:停止其监听容器的 JMS 和 AMQP 消息驱动适配器;停止接受新连接(同时保持现有连接打开)的 TCP 服务器连接工厂;丢弃(记录)任何新接收消息的 TCP 入站端点;以及对任何新请求返回
503 - Service Unavailable
的 HTTP 入站端点。 -
停止任何活动的通道,例如 JMS 或 AMQP 支持的通道。
-
停止所有
MessageSource
实例。 -
停止所有入站
MessageProducer
(不实现OrderlyShutdownCapable
接口的)。 -
根据传递给操作的
Long
参数值,等待剩余时间。这样做可以让所有进行中消息完成其流程。因此,在调用此操作时选择适当的超时时间非常重要。
-
调用所有
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 实例中的流程中间消息被滞留。现在的关机过程会保持轮询器运行,以允许这些消息被消耗和处理。 |