有序关闭
如“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 实例中的消息在流中途停留。现在,关闭操作会保持轮询器运行,以允许这些消息被排空和处理。 |