2017-01-25 12 views
0

У меня есть управляемый bean bean типа B. У меня есть @EnableREtry в классе @Configuration. Когда я использую @Retryable на doStuff(), метод будет повторно рассмотрен при ошибке, как ожидалось.Использование @Retryable в методах, определяемых в базовом классе весеннего боба, не повторяется

Но метод, который я действительно хочу повторить, - это метод, определенный в базовом классе, A. A - это конкретный класс, а не управляемый весом компонент. метод doSomethingElse не получает повторения при бросании исключения.

Я действительно хочу doSomethingElse для повторного использования, метод базового класса. Однако я не уверен, как это сделать. Я предполагаю, что это потому, что A - это конкретный класс, а не боб, хотя он служит базовым классом.

Должен ли я использовать RetryableTemplate в классе A?

public class B extends A { 

    public void doStuff() { 
     super.doSomethingElse(); 
    } 
} 

public class A { 
    // doesn't actually retry 
    @Retryable 
    public void doSomething() { 
     throws new Exception(); 
    } 
} 

ответ

4

@Retryable реализуется с использованием Spring AOP.

Только внешние вызовы для повторных попыток проходят через прокси (который вызывает метод в пределах RetryTemplate); внутренние вызовы внутри класса обходят прокси и поэтому не повторяются.

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

+0

Я верю, что RetryTemplate будет полезен здесь, поскольку он будет работать на классах, которые не управляются весной (по крайней мере, я так полагаю). –

+0

Это правильно. –