Spring @Retryable maxAttempts 值的运行时修改

Runtime modification of Spring @Retryable maxAttempts value

场景:我需要在运行时修改@Retryable的maxAttempts值,这样重试次数就可以了从数据库驱动

@Service
public class PropertyHolder {
 private int retryCount= 2; 
 public int retryCount() { return retryCount; }
 
 @Scheduled(fixedRate=3600000) //Query DB and update retryCount every 60mins
 private void updateRetryCount(int in) {
   this.retryCount = 0; //Fetch retryCount from DB and update retryCount
 }
}


@Service
public class SimpleService{
 @Retryable( value={ Throwable.class }, maxAttemptsExpression="#{@propertyHolder.retryCount()}")
 private void performTask() {
   // do some opertion that throws Exception
 }
}

PropertyHolder 将每 60 分钟更新一次 retryCount
这个PropertHolder#retryCount需要连线到SimpleService#performTask中的@Retryable

目前只取retryCount(2)的初始值。

这是正确的方法还是我犯了一些可怕的错误?

否;目前表达式仅在上下文初始化期间被评估;有一个开放的功能请求来添加运行时评估。

https://github.com/spring-projects/spring-retry/issues/184

目前您必须使用可变重试策略连接您自己的拦截器,并通过 @Retryable 属性 中的 interceptor 进行配置。