可設定的 IOException 處理
功能 > 持久性 > 可設定的 IOException 處理
從 5.3.1 版本開始,ActiveMQ Classic 為其基於檔案的消息儲存提供可設定的 IOException 處理。從 5.5 版本開始,當 JDBC 持久性適配器在 getConnection()
上發生失敗時,也會調用處理程序。
預設 IOException 處理程序
ActiveMQ Classic 帶有一個預設的 IOException 處理程序,它會執行以下操作。當某些基於檔案的消息儲存遇到 IOException 時,可能是以下兩種情況之一:磁碟不可用或磁碟上沒有更多空間。
第一種情況通常在磁碟故障或網路磁碟斷開連線時遇到。這些錯誤是「不可恢復的」,我們通常希望關閉 broker,直到磁碟問題解決。
當磁碟上沒有更多空間時,我們通常希望等待一些空間被回收,並繼續之前所做的事情(交換訊息)。所有基於檔案的持久性儲存都能够從這類錯誤中存活下來。
設定預設 IOException 處理程序
您可以使用幾個屬性來調整 DefaultIOExceptionHandler
的行為。首先,將異常處理程序實例化為 bean。然後,透過設定 broker 的 ioExceptionHandler
屬性,設定 broker 使用該異常處理程序。
範例
<bean id="ioExceptionHandler" class="org.apache.activemq.util.DefaultIOExceptionHandler">
<property name="ignoreAllErrors"><value>true</value></property>
</bean>
<broker xmlns="https://activemq.dev.org.tw/schema/core" ioExceptionHandler="#ioExceptionHandler">
...
</broker>
處理程序設定屬性
屬性 | 自 | 預設值 | 描述 |
---|---|---|---|
ignoreAllErrors |
5.4 | false |
當 true 時,所有錯誤都會被忽略,並且 broker 會保持執行狀態。 |
ignoreNoSpaceErrors |
5.4 | true |
當 false 時,「沒有磁碟空間」錯誤的處理方式與其他導致 broker 停止的錯誤相同。 |
noSpaceMessage |
5.4 | space |
用於與例外訊息進行比對的字串。當比對成功時,會產生「沒有磁碟空間」的錯誤。 |
ignoreSQLExceptions |
5.5 | true |
如果 true ,處理程序會忽略所有 SQLExceptions,允許它們由持久性適配器的鎖定器處理。如果 false ,則例外處理程序會處理例外。 |
sqlExceptionMessage |
5.5 | "" |
在忽略 SQLExceptions 時要比對的 SQLException 短語。僅忽略比對到的例外。所有 SQLExceptions 都會與預設的空字串比對。 |
stopStartConnectors |
5.5 | false |
當 true 時,傳輸連接器會停止(拒絕用戶端連線),但是,broker 會保持執行。在持久性適配器檢查點成功後,傳輸連接器將重新啟動。當傳輸連接器停止時,所有例外都會被忽略。此選項可確保在發生例如資料庫重新啟動時,broker 不需要手動重新啟動。 |
resumeCheckSleepPeriod |
5.5 | 5秒 |
持久性適配器檢查點之間的間隔。通常與 stopStartConnectors 一起使用。 |
systemExitOnShutdown |
5.13 | false |
在停止 broker 之前,將 broker 屬性 systemExitOnShutdown 設定為此值,以強制 JVM 退出。 |
預設設定會嘗試在例外訊息中找到指定的字串,以判斷是否為「沒有磁碟空間」的錯誤。在大多數平台(至少是我們測試過的平台)上,您會找到「space」這個詞。當然,您可以使用 noSpaceMessage
屬性,根據您的平台自訂此設定。
注意:從 ActiveMQ Classic 5.11 開始,JDBCIOExceptionHandler
已被棄用。它已由 org.apache.activemq.util.LeaseLockerIOExceptionHandler
取代,該處理程序將與任何支援可插拔儲存鎖定器的持久性適配器搭配使用,無論是否正在使用鎖定器。
編寫您自己的處理程序
如果此處理程序對您不起作用,您可以編寫自己的處理程序。例如,您可能想變更偵測磁碟已滿的方式,並執行一些外部命令,例如在 Linux 上使用 df
來確認。
您所要做的就是實作 org.apache.activemq.util.IOExceptionHandler
介面,然後設定 broker 使用它
<bean id="ioExceptionHandler" class="com.mycompany.MyIOExceptionHandler">
<property name="ignoreAllErrors"><value>true</value></property>
</bean>
<broker xmlns="https://activemq.dev.org.tw/schema/core" ioExceptionHandler="#ioExceptionHandler">
...
</broker>