Создайте шаблон повтора, чтобы повторить попытку истечения времени ожидания подключения и чтения - PullRequest
0 голосов
/ 15 октября 2019

Я включил шаблон отдыха в мое приложение весенней загрузки. Остальной шаблон успешно устанавливает соединение и время ожидания чтения. Я также интегрировал шаблон повторов, чтобы повторить эти подключения и считать тайм-ауты. Код для моего шаблона повторения приведен ниже. У меня проблема с моим кодом, и я не могу ее решить. Любое понимание было бы очень полезно. У меня ошибка с «обратным вызовом», в котором говорится, что он не может быть подключен автоматически, и бины не найдены. Для «FAILED» я получаю символ «Не удается разрешить».

 @Bean
public RetryTemplate retryTemplate(RetryCallback<RetryTemplate, Exception> callback) {
    RetryTemplate template = new RetryTemplate();
    ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
    Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<Class<? extends Throwable>, Boolean>();
    retryableExceptions.put(SocketTimeoutException.class, Boolean.TRUE);
    retryableExceptions.put(ConnectionPoolTimeoutException.class, Boolean.TRUE);
    retryableExceptions.put(ResourceAccessException.class, Boolean.TRUE);

    NeverRetryPolicy doNotRetry = new NeverRetryPolicy();
    SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(maxAttempts, retryableExceptions);
    simpleRetryPolicy.setMaxAttempts(maxAttempts);


    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
    backOffPolicy.setBackOffPeriod(backOffPeriod);

    template.setRetryPolicy(simpleRetryPolicy);
    template.setBackOffPolicy(backOffPolicy);

    try {
        return template.execute(callback);
    } catch (Exception e) {
        logger.error("Retry processing failed " + e.getMessage());
        return RetryTemplate.FAILED;
    }
}

1 Ответ

0 голосов
/ 15 октября 2019

A @Bean фабричный метод - это просто определение компонента;Вы не можете поместить код времени выполнения, подобный этому

try {
    return template.execute(callback);
} catch (Exception e) {
    logger.error("Retry processing failed " + e.getMessage());
    return RetryTemplate.FAILED;
}

. Вы должны return template;.

Поскольку вы передаете RetryCallback в метод фабрики, вы должны определить @Bean этого типа в другом месте.

Однако обратный вызовиспользуется во время выполнения, а не во время определения компонента.

Затем вы используете template.execute() в другом месте вашего приложения.

Именно то, что есть RetryTemplate.FAILED - такой константы нет.

...