@Retryable вызывает несколько раз, даже если исключение не произошло - PullRequest
0 голосов
/ 04 июля 2019

Я использовал пружину @Retryable для реализации вызова функции повтора, если при вызове другой службы с использованием RestTemplate.

возникают какие-либо проблемы.

Функция приведена ниже, проблема в том, что я присвоил maxAttempts значение 4, в случае возникновения каких-либо исключений его следует попробовать 4 раза. Но даже без каких-либо исключений функция выполняется 4 раза, и в БД создается четыре записи сотрудника.

функция createEmployee, которая вызывает другую службу для создания сотрудника в БД

@Retryable(value = { Exception.class }, maxAttempts = 4, backoff = @Backoff(delay = 1000))
public Response createEmployee(EmployeeRequest employeeRequest) 
{
  log.info(“creating employee”)
  :
  // calls another micro service using RestTemplate which creates employee into the DB
  :
}

@EnableRetry в AppConfig

@Configuration
@EnableRetry
public class AppConfig {
}

Может кто-нибудь, пожалуйста, помогите мне в этом

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

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

0 голосов
/ 04 июля 2019

Хорошо, проверьте, какое исключение может выдать рестлет-шаблон в случае сбоя, отметьте их только как повторную попытку.

0 голосов
/ 04 июля 2019

Вы должны проверить свою реализацию "звонки в другой микросервис".

Это может быть исключение другой службой, которая вызывается внутри этой логики. Я предлагаю создать пользовательское исключение и использовать его в своем определении Retry. Затем вы можете проверить, не является ли другой тип неожиданного исключения тем, которое форсировало 4 попытки повторения.

@Retryable(value = { YourCustomException.class }, maxAttempts = 4, backoff = @Backoff(delay = 1000))
public Response createEmployee(EmployeeRequest employeeRequest) 
{
  log.info(“creating employee”)
  :
  // calls another micro service using RestTemplate which creates employee into the DB
  :
}
...