java 如何在与Quarkus Smallrye Mutiny同步操作后调用异步操作?

idv4meu8  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(135)

我需要运行一些同步代码,然后在Quarkus中运行异步代码。文档听起来很有希望https://smallrye.io/smallrye-mutiny/2.2.0/guides/imperative-to-reactive/,但它似乎是过时的,因为Uni.createFrom()不返回Uni,而是返回UniCreate对象,并且自Quarkus Insights谈话录制以来,一些方法名称似乎已经更改。
我试过几种不同的方法,但都没有成功。这听起来像方法'transform'可以帮助,但我还没有找到如何在此上下文中使用它的示例。其他选项返回“线程不能被阻塞”。
我在找这样的东西:

public Multi<MyReponseMulti> queryAsStream(String query) {
    return Uni.createFrom().
        item(() -> {
            MyReponseUni myResponseUni = this.invokeRemoteServiceUsingBlockingIO(query);
            return this.invokeRemoteServiceUsingReactive(myResponseUni);
        });
        .runSubscriptionOn(Infrastructure.getDefaultWorkerPool())
        .subscribe().asCompletionStage();
}

现在上面的代码有一个编译错误:

Type mismatch: cannot convert from CompletableFuture<Multi<MyReponseMulti>> to Multi<MyReponseMulti>

有人能帮帮忙吗?谢谢!

9udxz4iz

9udxz4iz1#

我相信你需要这样的东西:

public Multi<MyReponseMulti> queryAsStream(String query) {
    // First, create a Uni for the blocking operation
    var blockingOp = Uni.createFrom().item(() -> {
      return this.invokeRemoteServiceUsingBlockingIO(query);
    }).runSubscriptionOn(Infrastructure.getDefaultWorkerPool());
    // Now, transform the outcome of this uni to the Multi 
    return blockingOp
       .onItem().transformToMulti(myResponseUni -> {
            // I guess this method returns a Multi
            return this.invokeRemoteServiceUsingReactive(myResponseUni);
        });
}

相关问题