可配置的 IOException 处理
特性 > 持久化 > 可配置的 IOException 处理
从 5.3.1 版本开始,ActiveMQ Classic 为其基于文件的的消息存储提供了可配置的 IOException 处理。从 5.5 版本开始,当 JDBC 持久化适配器在 getConnection()
上发生故障时,也会调用该处理程序。
默认 IOException 处理程序
ActiveMQ Classic 带有一个默认的 IOException 处理程序,它执行以下操作。当一些基于文件的消息存储遇到 IOException 时,它可能是以下两种情况之一:磁盘不可用或磁盘空间不足。
第一种情况通常发生在磁盘故障或网络磁盘断开连接时。这些错误是“不可恢复”的,我们通常希望关闭代理,直到磁盘问题得到解决。
当磁盘空间不足时,我们通常希望等待回收一些空间,然后继续我们之前一直在做的事情(交换消息)。所有基于文件的持久存储都能够在这些类型的错误中幸存。
配置默认 IOException 处理程序
您可以使用一些属性来调整 DefaultIOExceptionHandler
的行为。首先,将异常处理程序实例化为一个 Bean。然后通过设置代理的 ioExceptionHandler
属性,将代理配置为使用该异常处理程序。
示例
<bean id="ioExceptionHandler" class="org.apache.activemq.util.DefaultIOExceptionHandler">
<property name="ignoreAllErrors"><value>true</value></property>
</bean>
<broker xmlns="https://activemq.apache.org/schema/core" ioExceptionHandler="#ioExceptionHandler">
...
</broker>
处理程序配置属性
属性 | 自 | 默认值 | 描述 |
---|---|---|---|
ignoreAllErrors |
5.4 | false |
当 true 时,所有错误都被忽略,代理将继续运行。 |
ignoreNoSpaceErrors |
5.4 | true |
当 false 时,“磁盘空间不足”错误将与其他错误一样对待,导致代理停止。 |
noSpaceMessage |
5.4 | space |
用于与异常消息匹配的字符串。当匹配时,“磁盘空间不足”错误会导致结果。 |
ignoreSQLExceptions |
5.5 | true |
如果 true ,处理程序会忽略所有 SQLExceptions,允许持久化适配器的锁处理它们。当 false 时,异常处理程序会处理该异常。 |
sqlExceptionMessage |
5.5 | "" |
忽略 SQLException 时要匹配的 SQLException 短语。只有匹配的异常才会被忽略。所有 SQLExceptions 都匹配默认的空字符串。 |
stopStartConnectors |
5.5 | false |
当 true 时,传输连接器将停止(拒绝客户端连接),但是代理将继续运行。传输连接器将在持久化适配器检查点成功后重新启动。在传输连接器停止时,所有异常都将被忽略。此选项确保代理不需要在发生 DB 重启的情况下手动重启,例如。 |
resumeCheckSleepPeriod |
5.5 | 5 秒 |
持久化适配器检查点之间的间隔。通常与 stopStartConnectors 结合使用。 |
systemExitOnShutdown |
5.13 | false |
在停止代理之前,将代理属性 systemExitOnShutdown 设置为此值,以便可能强制 JVM 退出。 |
默认配置将尝试在异常消息中找到指定的字符串,以确定它是否为“磁盘空间不足”错误。在大多数平台上(至少是我们测试过的那些平台上),您会在其中找到单词“space”。当然,您可以使用 noSpaceMessage
属性将此自定义到您的平台。
注意:从 ActiveMQ Classic 5.11 版本开始,JDBCIOExceptionHandler
已被弃用。它已被 org.apache.activemq.util.LeaseLockerIOExceptionHandler
取代,该处理程序将与任何支持可插拔存储锁的持久化适配器一起使用,无论是否使用锁。
编写自己的处理程序
如果此处理程序不适合您,您可以编写自己的处理程序。例如,您可能希望更改检测磁盘满的方式并执行一些外部命令,例如在 Linux 上执行 df
以确保。
您要做的就是实现 org.apache.activemq.util.IOExceptionHandler
接口,然后将代理配置为使用它。
<bean id="ioExceptionHandler" class="com.mycompany.MyIOExceptionHandler">
<property name="ignoreAllErrors"><value>true</value></property>
</bean>
<broker xmlns="https://activemq.apache.org/schema/core" ioExceptionHandler="#ioExceptionHandler">
...
</broker>