RetryTemplate для указанных c исключений не запущен - PullRequest
1 голос
/ 06 января 2020

Я реализую логи повторных попыток c, используя шаблон повторных попыток пружины, который необходимо повторить 3 раза для 2 типов исключений, которые, как ожидается, произойдут при вызове API с использованием шаблона остатка. По какой-то причине я не вижу его срабатывания.

Вот моя конфигурация RetryTemplate

    @Bean(name="myRetryTemplate")

    public RetryTemplate retryTemplate() {

        RetryTemplate retryTemplate = new RetryTemplate();
        final SimpleRetryPolicy simpleRetryPolicyCheck1 = new SimpleRetryPolicy();
final SimpleRetryPolicy simpleRetryPolicyCheck2 = new SimpleRetryPolicy();
        simpleRetryPolicyCheck1.setMaxAttempts(3);
simpleRetryPolicyCheck2.setMaxAttempts(3);
        final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
        policyMap.put(Exception1.class, simpleRetryPolicyCheck1 );
        policyMap.put(Exception2.class, simpleRetryPolicyCheck2 );
        final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
        retryPolicy.setPolicyMap(policyMap);
        retryTemplate.setRetryPolicy(retryPolicy);
        return retryTemplate;
    }

Вот мой сервисный вызов:

public Object getSomething(@PathVariable("id") String id) throws Exception{


        return retryTemplate.execute(new RetryCallback<Object, Exception>() {
            @Override
            public Object doWithRetry(RetryContext arg0) {
                Object o = restTutorialClient.getEmployeesList(id);
                return o;
            }
        });

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

1 Ответ

0 голосов
/ 06 января 2020

Поскольку вам не нужна настраиваемая политика повторных попыток или настраиваемая политика отмены, вы можете использовать аннотацию @ Retryable :

    @Component
    public class RetryableAction {

        @Autowired
        private RestTutorialClient restTutorialClient;

        @Retryable(value = {
            Exception1.class,
            Exception2.class
        }, maxAttempts = 3, backoff = @Backoff(delay = 5000))
        Object retryAction(String id) throws Exception1, Exception2 {
            return restTutorialClient.getEmployeesList(id);

        }
    }

    @Service
    public class ServiceResource {

        @Autowired
        private RetryableAction retryableAction;

        @GetMapping("/get/{id}")
        public Object getSomething(@PathVariable("id") String id) throws Exception {
            Object object = retryableAction.retryAction(id);
            // Business logic
        }

РЕДАКТИРОВАТЬ : Поскольку вы хотите выполнить повторные попытки для обоих исключений 3 раза, я предлагаю создать класс супер исключений, который будет иметь двух детей Exception1 и Exception2:

    @Component
    public class RetryableAction {

        @Autowired
        private RestTutorialClient restTutorialClient;

        @Retryable(value = SuperException.class, maxAttempts = 3, backoff = @Backoff(delay = 5000))
        Object retryAction(String id) throws SuperException {
            return restTutorialClient.getEmployeesList(id);

        }
    }

    @Service
    public class ServiceResource {

        @Autowired
        private RetryableAction retryableAction;

        @GetMapping("/get/{id}")
        public Object getSomething(@PathVariable("id") String id) throws Exception {
            Object object = retryableAction.retryAction(id);
            // Business logic
        }

Надеюсь, что это поможет.

...