如何阻止Ignite客户端连接失败时输出异常与线程转储日志
解决方案
方案1:修改Ignite客户端配置抑制冗余日志
你看到的系统线程阻塞报错、线程栈打印是Ignite默认的失败检测机制触发的,可通过调整IgniteConfiguration配置关闭这类冗余输出:
IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setClientMode(true); cfg.setIgniteInstanceName(getInstanceName()); cfg.setPeerClassLoadingEnabled(true); // 新增配置:调整失败处理器,忽略客户端连接阶段的系统线程阻塞告警 NoOpFailureHandler failureHandler = new NoOpFailureHandler(); // 显式指定要忽略的失败类型,覆盖默认规则 failureHandler.setIgnoredFailureTypes(Collections.unmodifiableSet( EnumSet.of(FailureType.SYSTEM_WORKER_BLOCKED, FailureType.SYSTEM_CRITICAL_OPERATION_TIMEOUT) )); cfg.setFailureHandler(failureHandler); // 新增配置:拉长系统worker心跳超时时间,避免连接阶段误判阻塞 cfg.setSystemWorkerBlockedTimeout(60_000L); // 新增配置:关闭失败检测时的自动线程转储 cfg.setFailureDetectionTimeout(30_000L); TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder(); ipFinder.setAddresses(getIpFinderAddresses()); // 可选:调整重连间隔,降低连接失败提示的输出频率 TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi() .setIpFinder(ipFinder) .setReconnectDelay(10000L); // 改为每10秒重试一次 cfg.setDiscoverySpi(discoverySpi); return Ignition.start(cfg);
这个配置修改后,就不会再打印系统线程阻塞报错、异常栈和线程转储内容,仅保留Failed to connect to any address from IP finder的提示。
方案2:通过日志框架过滤冗余输出
如果不想修改Ignite代码配置,可直接在Spring Boot的日志配置中屏蔽对应类的冗余日志,以默认的Logback为例,在logback-spring.xml中添加如下规则:
<!-- 屏蔽系统线程阻塞报错 --> <logger name="org.apache.ignite.internal.util.typedef.G" level="OFF"/> <!-- 屏蔽失败处理器的线程栈和线程转储日志 --> <logger name="org.apache.ignite.internal.processors.failure.FailureProcessor" level="OFF"/> <!-- 保留DiscoverySpi的连接失败提示,可单独调整级别 --> <logger name="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi" level="WARN"/>
如果使用log4j2,也可对应添加相同包路径的日志过滤规则。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

