循序關閉

如「MBean Exporter」中所述,MBean 匯出器提供一個名為 stopActiveComponents 的 JMX 操作,用於以循序方式停止應用程式。此操作有一個 Long 參數。此參數指示操作等待多久(以毫秒為單位),以允許傳輸中的訊息完成。此操作的運作方式如下

  1. 在所有實作 OrderlyShutdownCapable 的 bean 上呼叫 beforeShutdown()

    這樣做可讓這些元件為關閉做好準備。實作此介面的元件範例及其在此呼叫中的作用包括:JMS 和 AMQP 訊息驅動的适配器,它們會停止其監聽器容器;TCP 伺服器連線工廠,它們會停止接受新連線(同時保持現有連線開啟);TCP 輸入端點,它們會捨棄(記錄)收到的任何新訊息;以及 HTTP 輸入端點,它們會針對任何新請求傳回 503 - 服務無法使用

  2. 停止任何作用中的通道,例如 JMS 或 AMQP 支援的通道。

  3. 停止所有 MessageSource 實例。

  4. 停止所有輸入 MessageProducer (非 OrderlyShutdownCapable)。

  5. 等待剩餘時間,如傳遞至操作的 Long 參數值所定義。

    這樣做可讓任何傳輸中的訊息完成其旅程。因此,在叫用此操作時,選擇適當的逾時非常重要。

  6. 在所有 OrderlyShutdownCapable 元件上呼叫 afterShutdown()

    這樣做可讓這些元件執行最終關閉工作(例如,關閉所有開啟的 Socket)。

循序關閉管理操作 中所討論,此操作可以使用 JMX 叫用。如果您希望以程式設計方式叫用此方法,則需要注入或以其他方式取得 IntegrationMBeanExporter 的參考。如果在 <int-jmx:mbean-export/> 定義上未提供 id 屬性,則 bean 會具有產生的名稱。如果多個 Spring Integration 上下文存在於同一個 JVM (MBeanServer) 中,則此名稱會包含隨機元件以避免 ObjectName 衝突。

因此,如果您希望以程式設計方式叫用此方法,我們建議您為匯出器提供 id 屬性,以便您可以輕鬆地在應用程式上下文中存取它。

最後,可以使用 <control-bus> 元素叫用此操作。如需詳細資訊,請參閱 監控 Spring Integration 範例應用程式

先前描述的演算法在版本 4.1 中得到改進。先前,所有任務執行器和排程器都會停止。這可能會導致 QueueChannel 實例中的流程中訊息保持不變。現在,關閉會讓輪詢器保持執行,以讓這些訊息被清空和處理。