Quarkus中MicroProfile容错事件的日志与回调方案问询
SmallRye MicroProfile容错:日志记录与事件回调实现方案
一、快速开启容错事件日志
你当前的日志配置仅覆盖Rest Client请求日志,而重试、熔断、舱壁等容错事件的日志由SmallRye Fault Tolerance组件负责,需单独配置对应日志类别:
在application.properties中添加:
# 输出容错事件核心日志(重试触发、熔断状态变化等) quarkus.log.category."io.smallrye.faulttolerance".level=DEBUG # 可选:输出更详细的内部执行流程日志 quarkus.log.category."io.smallrye.faulttolerance.core".level=DEBUG
配置生效后,触发重试、熔断器切换状态、舱壁满额时,日志会输出事件细节,比如重试次数、延迟时长、熔断器状态变更原因等。
二、通过CDI观察者实现事件回调
若需代码级的事件通知(而非仅日志),可利用SmallRye Fault Tolerance发布的CDI事件,通过观察者方法监听:
1. 监听重试事件
创建CDI托管Bean,捕获重试触发:
import io.smallrye.faulttolerance.core.retry.RetryEvent import jakarta.enterprise.context.ApplicationScoped import jakarta.enterprise.event.Observes @ApplicationScoped class FaultToleranceListener { fun handleRetryEvent(@Observes event: RetryEvent) { // 自定义处理逻辑:记录业务日志、发送告警等 println("重试触发:方法=${event.method.name},当前次数=${event.retryCount},延迟=${event.delay}ms") } }
2. 监听熔断器状态变化
捕获熔断器的打开/关闭/半开状态切换:
import io.smallrye.faulttolerance.core.circuit.breaker.CircuitBreakerStateChangedEvent import jakarta.enterprise.context.ApplicationScoped import jakarta.enterprise.event.Observes @ApplicationScoped class FaultToleranceListener { fun handleCircuitBreakerStateChange(@Observes event: CircuitBreakerStateChangedEvent) { println("熔断器状态变更:方法=${event.method.name},旧状态=${event.oldState},新状态=${event.newState}") } }
3. 监听舱壁事件
捕获舱壁队列满、请求入队/完成等事件:
import io.smallrye.faulttolerance.core.bulkhead.BulkheadEvent import jakarta.enterprise.context.ApplicationScoped import jakarta.enterprise.event.Observes @ApplicationScoped class FaultToleranceListener { fun handleBulkheadEvent(@Observes event: BulkheadEvent) { when (event.type) { BulkheadEvent.Type.QUEUE_ENTRY -> println("舱壁请求入队:方法=${event.method.name},队列大小=${event.queueSize}") BulkheadEvent.Type.QUEUE_FULL -> println("舱壁队列已满,请求被拒绝:方法=${event.method.name}") BulkheadEvent.Type.EXIT -> println("舱壁请求完成:方法=${event.method.name},当前并发数=${event.concurrentCalls}") } } }
三、关键注意事项
- 确保项目依赖
quarkus-smallrye-fault-tolerance扩展(通过Rest Client注解配置容错时通常已自动引入)。 - 事件监听类必须是CDI托管Bean(如标注
@ApplicationScoped),否则无法接收事件。 - 生产环境可将日志级别调整为
INFO,仅记录核心事件;开发环境用DEBUG查看完整流程。
内容的提问来源于stack exchange,提问作者Kiriakos Krastillis
相关产品推荐
相关产品推荐

