可配置的 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>

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。