gpt4 book ai didi

java - 如何在 Vertx 事件循环线程上运行 CompletableFuture 处理程序?

转载 作者:行者123 更新时间:2023-11-30 07:48:29 24 4
gpt4 key购买 nike

我有一个库 xyz,它为我提供了一个 CompletableFuture,我想在我的 Vertx (v3.5) 事件循环中对其进行处理。目前我正在使用 CompletableFuture.handle(BiFunction) (见下文)但我想使用 CompletableFuture.handleAsync(BiFunction, Executor) ,但我无法弄清楚如何在此方法调用中将 vertx 事件循环线程提供给第二个参数。

我尝试在 Vertx.runOnContext() 中执行整个代码但是 handleAsync 中的调用仍然在我想避免的 Java 的 ForkJoin 池上执行。

CompletableFuture<Void> f = xyz.someMethod();
f.handle((v, th) -> { //Want to run this in handleAsync()
if (th == null) {
future.complete(null);
} else {
future.completeExceptionally(th);
}
return null;
});

最佳答案

您可以通过简单地使用 vertx.nettyEventLoopGroup() 作为第二个参数来实现这一点,因此您的代码将如下所示:

CompletableFuture<Void> f = xyz.someMethod();
f.handleAsync((v, th) -> {

if (th == null) {
future.complete(null);
} else {
future.completeExceptionally(th);
}

return null;
}, vertx.nettyEventLoopGroup());

注意:上述代码可能会在 Vertx future 运行的不同线程上运行回调代码。

要保留 Vertx 的线程模型,您需要使用以下代码:

CompletableFuture<String> f = xyz.someMethod();
Context context = vertx.getOrCreateContext();
f.handleAsync((v, th) -> {
context.runOnContext(event -> {
if (th == null) {
future.complete(null);
} else {
future.completeExceptionally(th);
}
});
return null;
});

关于java - 如何在 Vertx 事件循环线程上运行 CompletableFuture 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219082/

24 4 0