Resilience4j熔断器默认统计所有异常,需通过ignoreExceptions配置指定不计入失败的自定义异常类;支持YAML/properties声明全限定名或代码中传入Class对象;被忽略异常仍会抛出,且父类忽略不覆盖子类,需显式列出;可通过指标验证是否生效。

Resilience4j 的熔断器默认会对所有抛出的异常(包括自定义业务异常)进行统计,触发失败率计算。若想让某些自定义业务异常不计入失败计数(即“不视为错误”),需通过 ignoreExceptions 配置明确指定这些异常类。
1. 在配置文件中声明 ignoreExceptions
使用 YAML 或 properties 方式配置时,需将目标异常类的全限定名(FQN)写入 ignore-exceptions 列表:
resilience4j.circuitbreaker:
instances:
myService:
ignore-exceptions:
- com.example.myapp.exception.BusinessValidationException
- com.example.myapp.exception.ResourceNotFoundException
failure-rate-threshold: 50
minimum-number-of-calls: 10
automatic-transition-from-open-to-half-open-enabled: true
注意:必须是完整的类名(含包路径),不能用简写或通配符;多个异常用列表形式逐行写入。
2. 在代码中构建 CircuitBreaker 时设置
若采用编程方式创建(如 Spring Boot 中手动 new 或用 CircuitBreakerRegistry),可通过 CircuitBreakerConfig.custom() 设置:
立即学习“Java免费学习笔记(深入)”;
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.minimumNumberOfCalls(10)
.ignoreExceptions(
BusinessValidationException.class,
ResourceNotFoundException.class
)
.build();
<p>CircuitBreaker circuitBreaker = CircuitBreaker.of("myService", config);</p>这里传入的是 Class 对象,类型安全,IDE 可提示补全,推荐在测试或非 Spring 环境中使用。
3. 注意事项与常见误区
忽略异常只影响熔断器的“失败判定”,不影响异常本身是否被抛出或捕获:
- 被 ignore 的异常仍会向上抛出,调用方需自行处理
- 父类异常不会自动被忽略——例如 ignore
BusinessException,但抛出其子类BusinessValidationException仍会计入失败,除非显式列出子类 - 运行时异常(RuntimeException)和检查异常(Checked Exception)均可被 ignore,无类型限制
- Spring AOP 代理下,若异常在切面中被吞掉或转换,可能导致熔断器实际捕获不到原始异常,此时 ignore 配置无效
4. 验证 ignore 是否生效
可通过日志或断点确认:当抛出被 ignore 的异常时,CircuitBreaker 的 getMetrics().getNumberOfFailedCalls() 不应增加;同时可调用 circuitBreaker.getStats().getFailureRate() 观察失败率变化趋势。
不复杂但容易忽略。


















