ActiveMQ双节点主从部署下,如何抑制从节点的JDBC警告?
这个问题我在部署跨节点主从的ActiveMQ集群时也遇到过,本质是主从共享JDBC存储,从节点启动时尝试初始化数据库表和索引,但这些资源已经被主节点创建完毕,所以才会抛出重复创建的警告。这里有几个实用的解决办法:
方法一:从根源跳过从节点的表初始化
既然主节点已经负责创建所有必要的表和索引,从节点完全不需要再执行这个步骤。在从节点的activemq.xml配置文件中,找到JDBC持久化适配器的配置,添加createTablesOnStartup="false":<persistenceAdapter> <jdbcPersistenceAdapter dataSource="#你的数据源ID" createTablesOnStartup="false"/> </persistenceAdapter>注意:第一次部署集群时,一定要先启动主节点,等表和索引都创建完成后再启动从节点,不然从节点会因找不到数据库表而报错。这个方法是最推荐的,直接避免了不必要的初始化操作,既优化了启动速度,也消除了警告。
方法二:调整日志级别过滤警告
如果不想修改持久化配置,可以通过调整日志框架的级别,把JDBC相关的WARN日志过滤掉。假设你用的是Log4j2,修改log4j2.xml,添加针对ActiveMQ JDBC存储类的日志配置:<Logger name="org.apache.activemq.store.jdbc" level="ERROR" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="File"/> </Logger>这样该类只会输出ERROR及以上级别的日志,那些重复创建索引的WARN信息就不会再出现在日志里了。如果用的是Logback,配置逻辑类似,只是语法稍有不同。
方法三:启用启动时JDBC异常忽略(适用于新版本ActiveMQ)
如果你使用的是较新的ActiveMQ版本(比如5.15+),可以尝试设置ignoreJdbcExceptionOnStartup="true",这个参数专门用来忽略启动时的JDBC初始化异常(比如表/索引已存在):<persistenceAdapter> <jdbcPersistenceAdapter dataSource="#你的数据源ID" ignoreJdbcExceptionOnStartup="true"/> </persistenceAdapter>这个参数比单纯调整日志级别更精准,只会忽略启动时的初始化异常,不会影响其他JDBC相关的错误日志输出。
内容的提问来源于stack exchange,提问作者Haris Farooqui

