【问题标题】:The best way to repeat the request in Project reactor在 Project reactor 中重复请求的最佳方式
【发布时间】:2019-07-25 08:22:06
【问题描述】:

我是响应式编程的新手。

我们在 SpringBoot 中有一个使用 project-reactor 的应用程序。在此内部,我们向第三方服务发出 HTTP 请求并获得 Mono 作为结果。

fun getResultFromService() : Mono<Result> {
   //requesting the third party REST API
}

我想:

  1. 检查响应码
  2. 对于某些值重复请求 M 次,它们之间的差异为 N 秒

  • 最好的方法是什么?
  • 我应该用什么来代替Thread.sleep()
  • 我检查了repeatWhenEmpty,我认为它不适合仅用于 M 尝试。

【问题讨论】:

  • 您在此处描述的内容听起来有点像出现错误时的基本指数退避操作。您是否考虑过使用内置的retryBackOff() 方法?
  • @MichaelBerry 是的,我也找到了。我不确定如何使用它检查响应的状态代码

标签: spring-boot kotlin project-reactor


【解决方案1】:

关键是你需要将错误响应码转换成Mono上的错误。完成此操作后,您可以使用 cmets 中 Michael Berry 提到的 retryBackoff 运算符。

fun main()
{
    getResultFromService()
            .flatMap {
                if (it.statusCode == 500 )
                    Mono.error(RuntimeException("Error which should be retried"))
                else Mono.just(it)
            }.retryBackoff(3, Duration.ofMillis(500), Duration.ofMillis(500))
            .block()
}

fun getResultFromService() : Mono<Result>
{
    //requesting the third party REST API
    TODO("Implement it.")
}

data class Result(
    val statusCode: Int,
    val response: Any
)

【讨论】:

  • 谢谢。我也明白我需要先抛出一个异常,然后再捕获它重试。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2021-02-25
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多