При вызове стороннего интерфейса или использовании 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