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