Механизм повтора Spring Retry

Spring Boot задняя часть GitHub Spring

При вызове стороннего интерфейса или использовании mq будут сетевые аномалии, такие как дрожание сети, тайм-аут соединения и т. д., поэтому вам нужно повторить попытку. Чтобы сделать обработку более надежной и менее подверженной сбоям, последующие попытки операций иногда помогают выполнить неудачную операцию. Например, удаленный вызов веб-службы или службы RMI из-за сбоя сети или исключения DeadLockLoserException в обновлении базы данных может разрешиться после короткого ожидания. Для автоматизации повторных попыток выполнения этих операций в Spring Batch предусмотрена стратегия RetryOperations. Однако функция повтора не зависит от версии Spring Batch 2.2.0 и становится модулем Spring Retry.

импортировать зависимости

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>

Необходимо представить зависимости Spring-retry и aspectjweaver.

начальный класс


@SpringBootApplication
@EnableRetry
public class SpringbootRetryApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRetryApplication.class, args);
    }
}

Чтобы включить перехват повторных попыток в классе ввода, используйте@EnableRetryаннотация.

Service

@Service
public class PayService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private final int totalNum = 100000;

    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    public int minGoodsnum(int num) throws Exception {
        logger.info("减库存开始" + LocalTime.now());
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            logger.error("illegal");
        }
        if (num <= 0) {
            throw new IllegalArgumentException("数量不对");
        }
        logger.info("减库存执行结束" + LocalTime.now());
        return totalNum - num;
    }
}

@RetryableОписание параметра:

  • значение: указанное исключение будет выдано перед повторной попыткой
  • include: то же, что и значение, значение по умолчанию пусто, когда exclude также пусто, значение по умолчанию ненормально
  • исключить: указать исключения, которые не будут обрабатываться
  • maxAttempts: максимальное количество попыток, по умолчанию 3 раза
  • отсрочка: стратегия ожидания повторной попытки, используется по умолчанию@Backoff,@BackoffЗначение по умолчанию 1000L, и мы устанавливаем его на 2000L, значение по умолчанию множителя (заданного множителя задержки) равно 0, что означает, что повторная попытка будет выполнена после фиксированной паузы в 1 секунду. до 1,5, первый повтор 2 секунды, а второй Первый раз 3 секунды, третий раз 4,5 секунды.

тестовый класс

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootRetryApplicationTests {
    @Autowired
    private PayService payService;

    @Test
    public void payTest() throws Exception {
        int store = payService.minGoodsnum(-1);
        System.out.println("库存为:" + store);
    }

}

Консольный результат запуска выглядит следующим образом:

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

Когда повторные попытки исчерпаны, RetryOperations может передать управление другому обратному вызову, RecoveryCallback. Spring-Retry также предоставляет аннотацию @Recover, которая используется для метода постобработки сбоя повторной попытки @Retryable.Исключением в этом методе должно быть исключение, созданное в методе @Retryable, иначе этот метод не будет вызываться.

@Recover
public int recover(Exception e) {
    logger.warn("减库存失败!!!" + LocalTime.now());
    return totalNum;
}

В Сервисе после добавления вышеуказанного метода протестируйте его.

Видно, что когда три попытки будут завершены, будет вызван метод Recovery, и исключение больше не будет выброшено.

Суммировать

В этой статье в основном рассказывается о простом применении Spring-Retry в проекте Spring Boot, в основном настраиваются некоторые стратегии повтора на основе аннотаций, которые относительно просты в использовании. Основные применимые сценарии — это вызов сторонних интерфейсов или использование mq. Из-за сетевых аномалий, таких как дрожание сети, время ожидания соединения и т. д., вам необходимо повторить попытку сейчас.

Код для этой статьи: https://github.com/keets2012/Spring-Cloud_Samples/tree/master/springboot-retry

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号

Ссылаться на

  1. Springboot интегрирует повторную попытку (механизм повторной попытки)