我有一个问题,当多个期货组合在一起,以执行 更新 书籍 桌子和 插入删除 在中间表_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 枝 掌握 (因为我不想合并这些功能不全的变化)。
我已经(更诚实 @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));
这样(解决了)未来的代码 不见得会延迟 且错误不显示,删除和插入都能成功执行。