首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mutiny:从单个uni超时恢复

Mutiny:从单个uni超时恢复
EN

Stack Overflow用户
提问于 2020-10-08 20:16:42
回答 1查看 582关注 0票数 0

从一个quarkus (kotlin)应用程序中,我并行地请求多个端点(相同的端点,但具有不同的基URL),然后我组合uni,以便不会顺序地等待每个响应。

下面是一个示例:

代码语言:javascript
复制
      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)。

如何正确地做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 13:30:46

使用:.ifNoItem().after(Duration.ofMillis(1).fail()代替.ifNoItem().after(Duration.ofMillis(1)).recoverWithItem(null),它将传播故障。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64262328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档