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
进行配置。
场景:我需要在运行时修改@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
进行配置。