Проблема с повторной попыткой Spring для блока исключения

Я пытаюсь повторить попытку https://www.mscharhag.com/spring/spring-retry, но столкнулся с проблемой. У меня есть метод

public String methodA( T Object)  {
    try{

    }catch(someException sme){
       return fixit(Object);
    }
}

@Retryable(value = {someException.class}, maxAttempts = 3)
public String fixit( T Object)  {
    return x;
}

Где мне нужно попробовать fixit 3 раза, если возникает одно и то же исключение. Но почему-то повторная попытка не работает для метода, который я вызываю из блока исключений.

Любые указатели на то, чего не хватает? Если я добавлю аннотацию поверх метода A, он будет работать, но это не то поведение, которое я хочу. Я пробовал @ Recover, но он вызывается только после попытки maxAttempts, а не при каждом попадании исключения.


person Sajna    schedule 30.11.2017    source источник
comment
Spring AOP работает с использованием прокси, что означает, что проксируются только вызовы методов в объект. Вы вызываете метод из прокси.   -  person M. Deinum    schedule 30.11.2017


Ответы (1)


Я предполагаю, что @Retryable работает с перехватчиками АОП и прокси Java.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете метод в том же классе, и поэтому прокси AOP не задействован. Вот почему ваш код начинает работать должным образом, когда вы перемещаете аннотацию к методу methodA (поскольку я предполагаю, что этот метод получает вызов из другого класса).

Что вы можете сделать, так это переместить свой метод fixit в другой компонент Spring и вставить его в компонент Spring с помощью methodA

@Component
class ClassWithMethodA {

  @Autowired
  private AnotherBean bean;

  public String methodA( T o)  {
    try{

    }catch(someException sme){
       return bean.fixit(o);
    }
  }
}

@Component
class AnotherBean {
  @Retryable(value = {someException.class}, maxAttempts = 3)
  public String fixit( T o)  {
    return x;
  }
}
person saw303    schedule 30.11.2017
comment
Пробовал это. Но такая же проблема. Это называется исправлением AnotherBean, но только один раз - person Sajna; 30.11.2017
comment
Вы добавили @EnableRetry в @Configuration класс? - person Gary Russell; 30.11.2017