有序关闭
如“MBean 导出器”中所述,MBean 导出器提供了一个名为stopActiveComponents
的 JMX 操作,用于以有序方式停止应用程序。此操作具有单个Long
参数。该参数指示操作等待多长时间(以毫秒为单位)以允许正在处理的消息完成。此操作的工作原理如下:
-
对实现
OrderlyShutdownCapable
的所有 Bean 调用beforeShutdown()
。这样做可以让这些组件准备关闭。实现此接口的组件示例及其在此调用中的作用包括:停止其侦听器容器的 JMS 和 AMQP 消息驱动适配器;停止接受新连接(同时保持现有连接打开)的 TCP 服务器连接工厂;丢弃(记录)任何接收到的新消息的 TCP 入站端点;以及对任何新请求返回
503 - 服务不可用
的 HTTP 入站端点。 -
停止任何活动通道,例如基于 JMS 或 AMQP 的通道。
-
停止所有
MessageSource
实例。 -
停止所有入站
MessageProducer
(不是OrderlyShutdownCapable
的)。 -
等待任何剩余时间,如传递给操作的
Long
参数的值所定义。这样做可以让任何正在处理的消息完成其处理过程。因此,在调用此操作时选择合适的超时时间非常重要。
-
对所有
OrderlyShutdownCapable
组件调用afterShutdown()
。这样做可以让这些组件执行最终的关闭任务(例如,关闭所有打开的套接字)。
如有序关闭管理操作中所述,可以使用 JMX 调用此操作。如果要以编程方式调用该方法,则需要注入或以其他方式获取对IntegrationMBeanExporter
的引用。如果在<int-jmx:mbean-export/>
定义中未提供id
属性,则 Bean 将具有生成的名称。此名称包含一个随机组件,以避免在同一 JVM(MBeanServer
)中存在多个 Spring Integration 上下文时出现ObjectName
冲突。
因此,如果您希望以编程方式调用该方法,我们建议您为导出器提供一个id
属性,以便您可以轻松地在应用程序上下文中访问它。
最后,可以使用<control-bus>
元素调用此操作。有关详细信息,请参阅监控 Spring Integration 示例应用程序。
前面描述的算法在 4.1 版中得到了改进。以前,所有任务执行器和调度器都会停止。这可能会导致QueueChannel 实例中的中间消息保留。现在,关闭会让轮询器继续运行,以允许这些消息被清空并处理。 |