从一个quarkus (kotlin)应用程序中,我并行地请求多个端点(相同的端点,但具有不同的基URL),然后我组合uni,以便不会顺序地等待每个响应。
下面是一个示例:
val unis = repository.findUnis()
?.sites
?.map { site ->
RestClientBuilder.newBuilder()
.baseUri(URI.create(site.url))
.build(MyClientService::class.java)
.api("param")
.ifNoItem()
.after(Duration.ofMillis(1))
.recoverWithItem(null)
.onFailure()
.invoke {
logger.info("Error while connecting to ${site.url}", it)
}
.onFailure()
.recoverWithItem(null as? String)
}
return Uni.combine().all().unis<String>(unis)
.combinedWith { it as (List<String?>?) }
.await().atMost(Duration.ofMillis(1))
?.filterNotNull()我遇到的问题是在超时的情况下不使用ifNoItem。如果单个uni耗时超过1毫秒(此值仅用于测试...)然后,最后一个块向combinedWith(...).await()抛出一个TimeoutException。
我希望在单个uni级别处理超时,并将此错误视为故障(并记录和恢复)。但这似乎行不通。我的实现来自https://smallrye.io/smallrye-mutiny/#_how_do_i_handle_timeout)。
如何正确地做到这一点?
发布于 2020-10-09 13:30:46
使用:.ifNoItem().after(Duration.ofMillis(1).fail()代替.ifNoItem().after(Duration.ofMillis(1)).recoverWithItem(null),它将传播故障。
https://stackoverflow.com/questions/64262328
复制相似问题