有序關機

如同"MBean Exporter"中所述,MBean exporter 提供了一個名為 stopActiveComponents 的 JMX 操作,用於有序地停止應用程式。該操作接受一個 Long 型別的引數,表示操作等待進行中訊息完成的時間(毫秒)。該操作的工作流程如下:

  1. 呼叫實現 OrderlyShutdownCapable 介面的所有 bean 的 beforeShutdown() 方法。

    這樣做可以讓這些元件為關機做準備。實現此介面並在呼叫此方法時執行操作的元件示例包括:停止其監聽容器的 JMS 和 AMQP 訊息驅動介面卡;停止接受新連線(同時保持現有連線開啟)的 TCP 伺服器連線工廠;丟棄(記錄)任何新接收訊息的 TCP 入站端點;以及對任何新請求返回 503 - Service Unavailable 的 HTTP 入站端點。

  2. 停止任何活動的通道,例如 JMS 或 AMQP 支援的通道。

  3. 停止所有 MessageSource 例項。

  4. 停止所有入站 MessageProducer (不實現 OrderlyShutdownCapable 介面的)。

  5. 根據傳遞給操作的 Long 引數值,等待剩餘時間。

    這樣做可以讓所有進行中訊息完成其流程。因此,在呼叫此操作時選擇適當的超時時間非常重要。

  6. 呼叫所有 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 例項中的流程中間訊息被滯留。現在的關機過程會保持輪詢器執行,以允許這些訊息被消耗和處理。