我想使用vertx开发我的应用程序承诺样式,并且CompletableFuture非常适合此目的,但JVM在CompletableFuture的背景上使用fork / join,这可能会破坏Vertx线程安全。
您对项目有任何想法或使用此功能吗?
答案 0 :(得分:3)
还有https://github.com/cescoffier/vertx-completable-future。来自自述文件:
此项目提供Completable Future API,但强制执行Vert.x线程模型:
- 使用xAsync方法(没有执行程序)时,将在Vert.x上下文中调用回调
- 使用非异步时,它使用调用程序线程。如果它是Vert.x线程,则使用相同的线程。如果没有从Vert.x线程调用,它仍然使用调用者线程
- 将xAsync方法与Executor参数一起使用时,此执行程序用于执行回调(不强制执行Vert.x线程系统)
但是还没有使用过。
答案 1 :(得分:2)
是的,这是一个例子http://qrman.github.io/posts/2015/08/28/callback_hell_completablefuture_ftw/
但我认为JavaRx是更好的解决方案,因为它通过vert.x http://vertx.io/docs/vertx-rx/java/支持作为一等公民
答案 2 :(得分:0)
从技术上看,总是可以对非Vertx管理的其他线程执行异步操作,并返回要由Vertx托管线程使用的结果。关键是要获取Context
之前,然后使用vertx.getOrCreateContext()
开始异步操作,然后在准备就绪后使用它返回结果。
假设您有某种Handler<AsyncResult<>>
,这可以是示例代码:
public void doAsyncThing(String someParam, String otherParam, Handler<AsyncResult<Void>> resultHandler) {
Context vertxContext = vertx.getOrCreateContext();
CompletableFuture<Void> future =
someOperatinThatTriggersAsync(someParam, otherParam)
.handleAsync((unused, throwable) -> {
vertxContext.runOnContext(unused1 -> {
if (throwable == null) {
responseHandler.handle(Future.succeededFuture());
} else {
responseHandler.handle(Future.failedFuture(throwable));
}
});
return null;
});
}