使用ertx-jooq-classic-reactive:5.0.1合成期货时,出现连接未打开的错误。

问题描述 投票:1回答:1

我有一个问题,当多个期货组合在一起,以执行 更新 书籍 桌子和 插入删除 在中间表_Category_Book_和_Author_Book_中的某些行,因为 书籍 与作者和分类的多对多关系有关。我在控制台得到的错误信息是

ERROR com.ns.vertx.pg.BookJooqQueries - Error, something failed in deleteCategoryBookFuture.compose(.)! 原因:io.vertx.core.VertxException。连接未打开CLOSED

此外,我还混合使用DAO实例和 执行() 的方法,对 ReactiveClassicGenericQueryExecutor(通用查询执行器) 类。这就是 回帖链接 到我的班级,在那里我得到了这个错误,这是 HttpVerticle 路由、DAO和其他配置发生在我的RESTful Web服务中。

我不知道是否有可能是我 "过度合成 "了Future实例而导致了这个错误,但据我所知,合成是在某些操作(插入删除更新)需要按顺序执行,而且都要成功。

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

注:我在我的 书_CRUD掌握 (因为我不想合并这些功能不全的变化)。

java postgresql vert.x jooq
1个回答
0
投票

我已经(更诚实 @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));

这样(解决了)未来的代码 不见得会延迟 且错误不显示,删除和插入都能成功执行。

© www.soinside.com 2019 - 2024. All rights reserved.