0

从一个 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().

我想在单个 uni 级别处理超时,并将此错误视为失败(并记录和恢复)。但这似乎不起作用。我的实现来自https://smallrye.io/smallrye-mutiny/#_how_do_i_handle_timeout)。

如何正确地做到这一点?

4

1 回答 1

1

而不是.ifNoItem().after(Duration.ofMillis(1)).recoverWithItem(null), 使用: .ifNoItem().after(Duration.ofMillis(1).fail()这将传播失败。

于 2020-10-09T05:30:45.720 回答