有序關閉
如“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 例項中的訊息在流中途停留。現在,關閉操作會保持輪詢器執行,以允許這些訊息被排空和處理。 |