Spring-Retry не может найти метод восстановления при реализации интерфейса - PullRequest
0 голосов
/ 05 ноября 2018

Я обнаружил проблему при повторном запуске с пружинной загрузкой. Когда класс реализует интерфейс, он не может войти в метод @recover после превышения максимального числа попыток. Но когда я ввожу обычный класс, я могу ввести этот метод. Ваша быстрая помощь и добрые советы будут высоко оценены, спасибо!

Когда я это делаю, я могу ввести метод @Recover

@Service
public class TestService {

    @Retryable(Exception.class)
    public String retry(String c) throws Exception{
        throw new Exception();
    }

    @Recover
    public String recover(Exception e,String c) throws Exception{
        System.out.println("got error");
        return null;
    }
}

Но как только класс реализует другой интерфейс, он не работает

@Service
public class TestService implements TestServiceI{

    @Override
    @Retryable(Exception.class)
    public String retry(String c) throws Exception{
        throw new Exception();
    }

    @Recover
    public String recover(Exception e,String c) throws Exception{
        System.out.println("got error");
        return null;
    }
}

1 Ответ

0 голосов
/ 05 ноября 2018

Spring-Retry использует AOP для реализации @Retry. При использовании AOP по умолчанию используется JDK Dynamic Proxies. Динамические прокси JDK основаны на интерфейсе.

Это означает, что вы получаете динамически создаваемый класс, который претендует на TestServiceI, но не на TestService. Прокси-сервер не включает метод recover (так как его нет в интерфейсе), и поэтому Spring Retry не может его обнаружить.

Для исправления необходимо включить прокси на основе классов для Spring Retry, установив для атрибута proxyTargetClass для @EnableRetry значение true (см. javadoc ).

@EnableRetry(proxyTargetClass=true) 
...