2016-09-15 1 views
0

Я использую 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 во время выполнения.

Есть ли весной весна, где я могу изменить RetryInterceptor во время выполнения и сделать код использующим конкретный RetryOperationsInterceptor?

+0

Почему вы используете абстрактный интерфейс? –

+1

Перехватчики создаются при создании бобов. Изменение этого (хотя возможно возможно) будет неосуществимым. Я думаю, что вы используете вызовы для делегирования повторного перехватчика. Имейте 1 перехватчик и вводите туда субперехватчики. Перехватчик может затем делегировать на правильный, основанный на том, что вы делаете это деление. – pandaadb

+0

Некоторые старые коды. абстрактное ключевое слово устарело, поэтому его следует удалить. :). Спасибо за указание на это, удалит его, когда я создам вышеуказанные функции. – ancoder

ответ

1

Вы не можете (легко) изменить перехватчик, но вы можете изменить RetryTemplate во время выполнения (setRetryOperations()).

Поле в перехватчике не является volatile, поэтому может потребоваться некоторое время, прежде чем все потоки будут видеть новый шаблон до тех пор, пока не будет закрыт кэш процессора процессора.

Если вы используете повторную попытку состояния, состояние будет потеряно. В этом случае вы можете изменить политику повтора в существующем шаблоне (то есть в перехватчике).

Смежные вопросы