You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:55:19