使用 vertx-jooq-classic-reactive 编写 Futures 时获取错误连接未打开关闭:5.0.1

Getting ERROR Connection not open CLOSED when composing Futures using vertx-jooq-classic-reactive: 5.0.1

我在组合多个 Future 以执行 update Book table 和 insert/delete 中间 tables _Category_Book_ 和 _Author_Book_ 的某些行,因为 Book 与 Many- 相关联与作者和类别的一对多关系。我在控制台中收到的错误消息是:

ERROR com.ns.vertx.pg.BookJooqQueries - Error, something failed in deleteCategoryBookFuture.compose(..)! Cause: io.vertx.core.VertxException: Connection not open CLOSED

此外,我在 ReactiveClassicGenericQueryExecutor class 的实例上混合使用 DAO 实例和 execute() 方法。这是 repo link to my class where I am getting this error and this is HttpVerticle 为我的 RESTful 网络服务进行路由、DAO 和其他配置的地方。

我不知道我是否有可能 "over-composed" 未来的实例,这就是导致此错误的原因,但据我了解,当某些操作时使用组合 (Insert/Delete/Update)需要按顺序执行,必须全部成功。

我正在使用的库:
Vert.x版本:3.8.2
vertx-jooq-classic-reactive: 5.0.1
postgresql: 42.2.2(我机器上的 Postgres 数据库是 11.7 版)

注意:我在 book_CRUD 分支中进行了这些更改,不要与 master 混淆(因为我不想合并这些功能不全的更改)。

我(说实话 @jklingsporn)设法找到了解决问题的方法。问题是(据我所知)不是组合 Future 实例,而是组合右侧值(即方法调用)。例如,我的代码是这样写的:

 Set<Long> deleteCategoryIdsSet = HashSet();
    Future<Integer> insertBCFuture = categoryBookDAO.insert(bookCategories);
    Future<Integer> deleteCategoryBookFuture = queryExecutor.execute(dsl -> dsl
                        .deleteFrom(CATEGORY_BOOK)
                        .where(CATEGORY_BOOK.BOOK_ID.eq(Long.valueOf(bookId)))
                        .and(CATEGORY_BOOK.CATEGORY_ID.in(deleteCategoryIdsSet)))
    Future<Integer> retVal = insertBCFuture.compose(res -> deleteCategoryBookFuture)
                   .setHandler(finalResRetVal -> {
                        // handle 'finalResRetVal'
..});

...并按照@jklingsporn 的建议将其更改为:

return queryExecutor.execute(dsl -> dsl
                        .deleteFrom(CATEGORY_BOOK)
                        .where(CATEGORY_BOOK.BOOK_ID.eq(Long.valueOf(bookId)))
                        .and(CATEGORY_BOOK.CATEGORY_ID.in(deleteCategoryIdsSet)))
                    .compose(res -> categoryBookDAO.insert(bookCategories));

以那种(已解决)的方式,未来的代码 does not get magically delayed 和错误不会出现,并且删除和插入已成功执行。