Spring Batch, как настроить период повтора для неудачных заданий - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно доставить несколько сообщений с высокой гарантией. Эти сообщения должны доставляться в виде ограниченных коллекций (не менее 100 в качестве примера). Чтобы решить мою задачу, я думаю, что я должен использовать весенний пакет Мне нужно настроить экспоненциально увеличивающееся время для каждой следующей неудачной попытки. Каждый объект данных должен иметь максимум 5 попыток доставки. Я ожидаю, что у меня будет возможность отслеживать все попытки и время следующей попытки через db. Весенняя партия предоставляет подготовленные таблицы для этого. Кажется, у моего потока есть только одно задание, но, проверяя схему, мы можем обнаружить, что задание имеет только статус завершения состояния (не полезная нагрузка): enter image description here

Также нет ни подсчета попыток, ни времени следующего выполнения.

Вопросы:

Мне не ясно, как настроить стратегию периода повторения. Должен ли я использовать другой инструмент (например, кварц) или мне нужно погрузиться глубже в весеннюю партию? Я не хочу делать свое собственное решение для этой задачи, оно похоже на порядковое и должно иметь элегантное решение.

1 Ответ

1 голос
/ 13 марта 2019

После того, как вы определили свою работу и как ее выполнить, вы можете использовать Spring Retry , которая обеспечивает ExponentialBackOffPolicy из коробки.Вот пример:

import java.time.LocalDateTime;

import org.junit.Test;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

public class RetryTemplateTest {

    private Job job; // under test, has to be initialized

    @Test
    public void testExponentialBackoff() throws Exception {
        // configure backoff policy
        ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
        exponentialBackOffPolicy.setInitialInterval(1000);
        exponentialBackOffPolicy.setMultiplier(2.0);
        exponentialBackOffPolicy.setMaxInterval(10000);

        // configure retry policy
        SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
        simpleRetryPolicy.setMaxAttempts(5);

        // configure retry template
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setBackOffPolicy(exponentialBackOffPolicy);
        retryTemplate.setRetryPolicy(simpleRetryPolicy);

        // run the job with retry on failure
        retryTemplate.execute(new RetryCallback<JobExecution, Exception>() {
            @Override
            public JobExecution doWithRetry(RetryContext context) throws Exception {
                return run(job);
            }
        });
    }

    private JobExecution run(Job job) throws Exception {
        System.out.println(LocalDateTime.now() + ": running job");
        if (true) { // just for test
            throw new Exception("Job failed");
        }
        return null;
    }
}

Этот пример печатает:

2019-03-13T09:19:21.882: running job
2019-03-13T09:19:22.892: running job
2019-03-13T09:19:24.893: running job
2019-03-13T09:19:28.894: running job
2019-03-13T09:19:36.895: running job

java.lang.Exception: Job failed

Как видите, шаблон повтора запустил задание в секундах 21, 22, 24, 28 и 36и повторил задание не более 5 раз, прежде чем потерпел неудачу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...