作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 webhook 服务,可以将事件发送到不同的源(URL)。根据设计,请求超时为 10s,如果失败,则重试发送 3 次。如果所有重试都失败,则必须执行代码以禁用 DB 中的该 URL。
到目前为止,我设法重试并延迟了 5 秒。但是,我不确定如何在失败后执行代码。
try{
String body = objectMapper.writeValueAsString(webhookDTO);
webClient.post()
.uri(webhook.getUrl())
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(body)
.exchange()
.timeout(Duration.ofSeconds(5))
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
.jitter(0d)
.doAfterRetry(retrySignal -> {
logger.info("Retried " + retrySignal.totalRetries());
})
.onRetryExhaustedThrow((retryBackoffSpec, retrySignal)
-> new WebhookTimeoutException()))
.doOnSuccess(clientResponse -> {
logger.info("Event is received by " + client);
})
.subscribe();
} catch (Exception e) {
logger.error("Error on webhook dispatcher: ", e);
}
最佳答案
你快到了!只需使用 doOnError
如图所示。这里的想法,一旦所有的尝试都失败了,你就会抛出WebhookTimeoutException
. doOnError 仅在抛出错误并更新数据库时调用。异常类是可选的。你可以忽略它。
webClient.post()
.uri(webhook.getUrl())
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(body)
.exchange()
.timeout(Duration.ofSeconds(5))
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
.jitter(0d)
.doAfterRetry(retrySignal -> {
logger.info("Retried " + retrySignal.totalRetries());
})
.onRetryExhaustedThrow((retryBackoffSpec, retrySignal)
-> new WebhookTimeoutException()))
.doOnSuccess(clientResponse -> {
logger.info("Event is received by " + client);
})
.doOnError(WebhookTimeoutException.class, (msg) -> {
System.out.println("Message :: " + msg);
// here update the DB
dbRepository.save(...);
})
.subscribe();
关于spring-boot - 如果所有重试都用尽,Spring Webclient 重试并执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61047452/
我想在订阅中捕获异常,但结果不符合预期。 this.userService.isUsernameValid (username) .pipe ( catchError
我是一名优秀的程序员,十分优秀!