Сохранить номер попытки повтора в WebClient

Мне нужно отправлять веб-хуки на определенный 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 г.

1 Ответ

Ваш ответ

Загрузить файл.