Мне нужно отправлять веб-хуки на определенный URL-адрес и, в случае неудачи, повторять отправку несколько раз, а также сохранять статус ответа, тело ответа и номер попытки для каждого запроса в базе данных.
Я написал два метода:
Как получить номер повторной попытки?
@SneakyThrows
public void sendWebHook(Transaction transaction) {
RetryBackoffSpec retryBackoffSpec = Retry.fixedDelay(5, Duration.ofSeconds(10));
GetTransactionResponse requestBody = transactionMapper.transactionToGetResponse(transaction);
webClient.post()
.uri(transaction.getNotificationUrl())
.body(Mono.just(requestBody), GetTransactionResponse.class)
.retrieve()
.onStatus(HttpStatusCode::isError, response ->
response
.toEntity(WebhookResponse.class)
.flatMap(responseEntity -> {
saveWebhook(transaction, responseEntity);
return Mono.error(new SendWebhookException(Objects.requireNonNull(responseEntity.getBody()).message(), "WEB_CLIENT_ERROR"));
}
)
)
.toEntity(WebhookResponse.class)
.timeout(Duration.ofSeconds(5))
.retryWhen(retryBackoffSpec)
.doOnSuccess(responseEntity -> saveWebhook(transaction, responseEntity))
.subscribe();
}
@SneakyThrows
private void saveWebhook(Transaction transaction, ResponseEntity<WebhookResponse> responseEntity) {
Json jsonRequestBody = Json.of(objectMapper.writeValueAsString(transactionMapper.transactionToGetResponse(transaction)));
Json jsonResponseBody = Json.of(objectMapper.writeValueAsString(responseEntity.getBody()));
WebHook webHook = WebHook.builder()
.transactionId(transaction.getId())
.attemptNumber(1)
.requestBody(jsonRequestBody)
.transaction(transaction)
.responseStatus(responseEntity.getStatusCode().value())
.responseBody(jsonResponseBody)
.createdAt(LocalDateTime.now())
.build();
webHookRepository.save(webHook).subscribe();
}
Милий
Вопрос задан23 июля 2024 г.