使用基于注释的Spring Retry在运行时动态更改拦截器

时间:2016-09-15 01:01:31

标签: java spring interceptor spring-annotations spring-retry

我正在使用基于注释的Spring Retry。以下是我的界面:

public interface IRetriever
{
      @Retryable(interceptor="RetryInterceptor") 
      public abstract List<Item> retrieve(final LogData transactionLogData, final RetrieveRequestType rqObject) throws InternalException, OpaqueExternalException;
}

有三个类实现此接口以调用下游服务。我想定义RetryInterceptors,以便对于每个下游调用,我​​应该能够定义一个单独的重试策略。本质上,我想在运行时更改RetryInterceptor。

在Spring中有没有办法在运行时更改RetryInterceptor并使代码使用特定的RetryOperationsInterceptor?

1 个答案:

答案 0 :(得分:1)

您无法(轻松)更改拦截器,但您可以在运行时更改RetryTemplatesetRetryOperations())。

拦截器中的字段不是volatile所以在所有线程看到新模板之前可能需要一些时间,直到CPU处理器缓存被中断为止。

如果您使用有状态重试,状态将会丢失。在这种情况下,您可以更改现有模板中的重试策略(拦截器中的重试)。