Mutiny:从单个 uni 超时中恢复
Mutiny: recover from a single uni timeout
我从 quarkus (kotlin) appli 中请求多个端点(相同的端点但具有不同的基 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).
如何正确操作?
代替.ifNoItem().after(Duration.ofMillis(1)).recoverWithItem(null)
,使用:
.ifNoItem().after(Duration.ofMillis(1).fail()
这将传播故障。
我从 quarkus (kotlin) appli 中请求多个端点(相同的端点但具有不同的基 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()
.
我想在单个 uni 级别处理超时,并将此错误视为失败(并记录和恢复)。但这似乎不起作用。我的实现来自 https://smallrye.io/smallrye-mutiny/#_how_do_i_handle_timeout).
如何正确操作?
代替.ifNoItem().after(Duration.ofMillis(1)).recoverWithItem(null)
,使用:
.ifNoItem().after(Duration.ofMillis(1).fail()
这将传播故障。