如何在上下文初始化后更新 spring 重试属性

How to update spring retry attributes even after context initialised

我正在使用 spring-重试从 https://launchdarkly.com/ 加载的配置。我们有这个功能标志服务,我可以从功能标志更改 maxAttemptsinterval 等配置。但是,spring-retry 没有反应。有什么方法可以检测这些新配置吗?

示例如下:

这是重试方法:

@Retryable(
            exceptionExpression = "#{@config.isInExceptionListForReExecution(#root)}",
            maxAttemptsExpression = "#{@config.getMaxAttemptsForReExecution()}",
            backoff = @Backoff(delayExpression = "#{@config.getIntervalBetweenReExecution()}"))
    @Transactional(value = "transactionManagerDC")
    public CustomRule executeWithRetry(CustomRule customRule, SyncObject oldObject, SyncObject newObject, CustomRuleType type, Map<String, Object> kafkaEvent, Boolean strictValidation) {
        int retry = RetrySynchronizationManager.getContext().getRetryCount();
        logger.info("Start executing process [{}] for object [{}] with Retry [{}]", customRule.getId(), objectId, retry);
        
    }

这是 config bean,它注入功能标志服务并从标志中读取值。

@Service
class Config {
    @Inject
    private FeatureFlagService featureFlagService;


    public boolean isInExceptionListForReExecution(Object exception1) {
        String stringFlag = featureFlagService.getStringFlag("exceptionlist");
        if (!stringFlag.contains(exception1.toString())) {
            return true;
        }
        return false;
    }

    public int getMaxAttemptsForReExecution() {
        int maxAttempts = featureFlagService.getIntFlag("maxAttempts");
        return maxAttempts;
    }

    public int getIntervalBetweenReExecution() {
        int interval = featureFlagService.getIntFlag("interval");
        return interval;
    }

}

如您所见,config bean 将从标志中检索所有配置。现在,第一次配置检索的内容将保留下来。如果我更改配置,它将不会被考虑用于尝试和间隔。如何检测这种变化?或者需要为此重新启动应用程序。

配置表达式仅在上下文初始化期间计算一次。

有一个开放的新功能请求可以在运行时对其进行评估。

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