Spring boot 在Project reactor中重复请求的最佳方式

Spring boot 在Project reactor中重复请求的最佳方式,spring-boot,kotlin,project-reactor,Spring Boot,Kotlin,Project Reactor,我对反应式编程相当陌生 我们在SpringBoot中使用projectreactor开发了一个应用程序。在这里面,我们向第三方服务发出一个HTTP请求,结果得到一个Mono fun getResultFromService() : Mono<Result> { //requesting the third party REST API } fun getResultFromService():Mono{ //请求第三方RESTAPI } 我想: 检查响应代码 对于某些值,重

我对反应式编程相当陌生

我们在SpringBoot中使用projectreactor开发了一个应用程序。在这里面,我们向第三方服务发出一个HTTP请求,结果得到一个Mono

fun getResultFromService() : Mono<Result> {
   //requesting the third party REST API
}
fun getResultFromService():Mono{
//请求第三方RESTAPI
}
我想:

  • 检查响应代码
  • 对于某些值,重复请求M次,其间相差N秒

    • 最好的方法是什么
    • 我应该使用什么来代替
      Thread.sleep()
    • 我检查了
      repeatWheempty
      ,我不认为它只适合M次尝试

    关键是您需要将错误响应代码转换为Mono上的错误。完成此操作后,可以使用注释中提到的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
    )
    
    fun main()
    {
    getResultFromService()
    .平面图{
    如果(it.statusCode==500)
    错误(RuntimeException(“应该重试的错误”))
    否则,就(它)
    }.retryBackoff(3,持续时间为百万(500),持续时间为百万(500))
    .block()
    }
    fun getResultFromService():Mono
    {
    //请求第三方RESTAPI
    TODO(“实现它”)
    }
    数据类结果(
    val状态代码:Int,
    val回复:有吗
    )
    
    您在这里描述的内容听起来有点像发生错误时的基本指数退避操作。你考虑过使用内置方法吗?@MichaelBerry是的,我也找到了。我不确定如何使用iThanks检查响应的状态代码。我也明白我需要先抛出一个异常,然后再捕获它。