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

Resilience4j-Retry Spring注解:重试耗尽后的自定义异常处理

解决Resilience4j重试耗尽后执行自定义错误处理的三种方案

方案一:使用@Retry的fallback属性指定降级方法

这是最直接的实现方式,通过@Retry注解的fallback属性,指定重试全部耗尽后要执行的方法。方法签名需与目标方法匹配,也可额外接收Throwable参数获取失败原因。

示例代码:

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Component;

@Component
public class CacheService {

    @Retry(name = "hydration", fallback = "hydrateCachesFallback")
    public void hydrateCaches() {
        // 缓存刷新业务逻辑,失败时触发重试
        throw new RuntimeException("缓存刷新失败");
    }

    // 重试耗尽后执行的自定义错误处理方法
    public void hydrateCachesFallback(Throwable throwable) {
        // 这里编写你的错误处理逻辑:比如记录告警、触发通知、执行备选方案
        System.err.println("所有重试已耗尽,原错误信息:" + throwable.getMessage());
    }
}

注意:fallback方法可与目标方法在同一类中,若目标方法有参数,fallback方法参数需与目标方法一致,末尾可添加Throwable参数接收异常。

方案二:自定义RetryEventListener监听重试事件

如果需要全局处理多个重试方法的失败逻辑,或者不想在每个方法上单独配置fallback,可通过监听Resilience4j的重试事件实现统一处理。

编写事件监听器

import io.github.resilience4j.retry.event.RetryEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class RetryFailureListener {

    @EventListener
    public void handleRetryExhaustedEvent(RetryEvent event) {
        // 判断是否为重试耗尽的失败事件
        if (event.getEventType() == RetryEvent.Type.RETRY_EXHAUSTED) {
            String retryName = event.getRetryName();
            Throwable failCause = event.getThrowable();
            
            // 自定义全局错误处理逻辑
            System.err.println("重试配置[" + retryName + "]已耗尽,失败原因:" + failCause.getMessage());
            // 例如:发送告警邮件、写入监控日志、触发运维通知等
        }
    }
}

你的application.yml原有配置无需修改,该监听器会自动监听所有Retry的事件,适合统一处理重试失败场景。

方案三:编程式RetryTemplate实现灵活控制

若注解式实现不够灵活,可改用编程式的RetryTemplate,在重试耗尽后直接执行自定义逻辑。

1. 配置Retry实例

import io.github.resilience4j.retry.Retry;
import io.github.resilience4j.retry.RetryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;

@Configuration
public class RetryConfig {

    @Bean(name = "hydrationRetry")
    public Retry hydrationRetry() {
        RetryConfig config = RetryConfig.custom()
                .maxAttempts(6)
                .waitDuration(Duration.ofSeconds(10))
                .build();
        return Retry.of("hydration", config);
    }
}

2. 使用Retry执行业务逻辑

import io.github.resilience4j.retry.Retry;
import io.vavr.control.Try;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class CacheService {

    private final Retry hydrationRetry;

    public CacheService(@Qualifier("hydrationRetry") Retry hydrationRetry) {
        this.hydrationRetry = hydrationRetry;
    }

    public void hydrateCaches() {
        Try.run(() -> {
            // 缓存刷新业务逻辑
            throw new RuntimeException("缓存刷新失败");
        }).retry(hydrationRetry).onFailure(throwable -> {
            // 重试耗尽后执行的自定义错误处理
            System.err.println("所有重试已耗尽,执行错误处理:" + throwable.getMessage());
            // 这里添加具体的错误处理操作
        }).get();
    }
}

这种方式适合需要根据不同异常类型执行差异化处理的场景,灵活性更强。


内容的提问来源于stack exchange,提问作者Geogrio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:00:31