如何从CompletableFuture返回错误响应?

时间:2020-10-09 21:37:36

标签: spring-boot rest kotlin asynchronous

有人知道在REST请求期间发生错误时如何从上游系统返回错误吗?

例如,如果我们有三个微服务:A,B和C。整个调用方案为:A-> B-> C。这里是REST。

当B向C发送REST请求时,C内将发生错误(类似于5 **的HTTP错误),从而导致500个HTTP错误代码作为对B的请求的答案。

目标是将该错误传递给初始微服务-A。

此任务很简单,在同步交互的情况下不需要很多工作,但是当我使用异步交互时,事情变得更加复杂。

在这里,我尝试借助“ CompletableFuture”来把握来自服务C的请求,然后尝试将响应传递到初始服务-A:

这段代码位于调用服务C的服务B中。

    var future: CompletableFuture<CarInfoDto>? = null
try {
    future = CompletableFuture.supplyAsync {
        runBlocking {
            myService.getCarInfo(carId)
        }
    }
    return ResponseEntity(future?.get(1000, TimeUnit.MILLISECONDS), HttpStatus.OK)
} catch (timeoutException: TimeoutException) {
    future?.thenApply { resp: CarInfoDto? ->
        resp?.let { Mono.just(it) }?.let {
            restClient
                    .post()
                    .uri(http://address_to_service_a.com)
                    .accept(MediaType.APPLICATION_JSON)
                    .body(it, CarInfoDto::class.java)
                    .exchange().block()
        }
    }
}

被调用的方法放在服务C上,这是它的签名:

    suspend fun getCarInfo(carId: String): CarInfoDto? {
    ...
}

问题是-如何将类似5xx的错误从服务C传输到服务A?

p.s。没有错误发生时,从C到A的数据传输就没有问题。

0 个答案:

没有答案