我对Java和Mutiny非常陌生。
如下所示,我的测试函数向Redis询问键"foo“的值,即"bar”。这是可行的,而且未来的onCompleted()会得到"bar“。
到目前一切尚好。
我对Uni.createFrom().future()位有两个问题。
The method future(Future<? extends T>) in the type UniCreate is not applicable for the arguments (Future<Response>)。我试过建议的解决办法,但最终陷在了一个更深的洞里。我的Java技能不足以完全理解错误的含义。Uni<String>返回到test()?我已经尝试了各种订阅和CompletableFutures,无法使任何工作。我想,我需要返回一个函数来生成Uni,但是对于如何做到这一点却不知所措。// The abbreviated setup
import io.vertx.redis.client.Redis;
private final Redis redisClient;
this.redisClient = Redis.createClient(vertx);
public Uni<String> test () {
// Ask Redis for the value of key "foo" => "bar"
Future<Response> futureResponse = this.redisClient.send(Request.cmd(Command.create("JSON.GET")).arg("foo"))
.compose(response -> {
// response == 'bar'
return Future.succeededFuture(response);
}).onComplete(res -> {
// res == 'bar'
});
// How to make the return of the Uni<String> wait for the completed futureResponse
// so it makes a Uni<String> from "bar" and returns it from the method?
Uni<String> respUni = Uni.createFrom().future(futureResponse);
return respUni;
}谢谢。感谢您的任何建议!(是的,我花了很多时间为自己解决这个问题);
发布于 2022-09-07 08:34:09
由于错误,更新了帖子。
UniCreate.future()接受某种类型的java.util.concurrent.Future,并返回相同类型的Uni。也就是说,您必须传递一个java.util.concurrent.Future<String>才能得到一个Uni<String>。
Redis客户端的send方法返回一个与io.vertx.core.Future<Response>不兼容的赋值。
幸运的是,API提供了io.vertx.core.Future#toCompletionStage来将vertx转换为JDK CompletionStage,而Mutiny提供了UniCreate.completionStage()来完成工作。
public Uni<String> test () {
Future<String> futureResponse = this.redisClient.send(Request.cmd(Command.create("JSON.GET")).arg("foo"))
.compose(response -> {
return Future.succeededFuture(response.toString());
});
Uni<String> respUni = Uni.createFrom().completionStage(futureResponse.toCompletionStage());
return respUni;
}https://stackoverflow.com/questions/73631825
复制相似问题