首页 > 解决方案 > vertx中的同步调用

问题描述

我们尝试将我们的项目从 servlet 重构为 vertx3.x。我们希望重用DAO负责查询数据的层:

interace Adapter {
    List<Feature> query(String layer);
}

class DataBaseAdapter implements Adapter {

}

class FileAdapter implements Adapter {

}

class HttpVertx extends AbstractVertx {
    void start() {
        HttpServer server = vertx.createHttpServer();
        Router router = Router.router(vertx);
        router.route().handler((h->{
            List<Feature> r=new ArrayList();
            String[] layers=getLayerFromRequest(h.request());
            layers.forEach(l->{
                h.vertx().executeBlocking(future->{
                    future.complete(getAdapter(l).query(l));
                },false,res->{
                    List<Feature> data=res.result();
                    r.addAll(data);
                    //now how can I know that the loop have ended, and I can send the `r` to the client?
                });
            });

        }));
        server.requestHandler(router::accept).listen(8080);
    }

    Adapter getAdapter(String layer){
        //return database or file adapter accordingly
        return null;
    }
}

如图,原来的adapter查询都是块操作,一旦我循环执行,不知道什么时候都完成了。

此外,我不确定是否有必要重构DatabaseAdapter使用vertx-jdbc? 如果是,我将不得不将 Adapter接口的方法签名更改为同步,但FileAdapter不支持。

什么是正确的重构解决方案?

标签: vert.x

解决方案


  1. 尝试将循环逻辑移动到executeBlocking块中并将处理程序类型更改为Handler<List<Feature>>

  2. 不,这不是绝对必要的,因为包装这些调用executeBlocking已经在为 Verticle 的工作池进行数据库交互的昂贵工作。


推荐阅读