[英]R2DBC database client not calling doOnSuccess or terminating for nested calls
代码到达“填充要执行的迁移”日志。 然而,没有任何 AAA、EEE 和 CCC 日志被访问,因此 doOnSuccess 中没有代码正在运行。 任何有关如何解决此问题的帮助将不胜感激。
databaseClient.execute().sql("CREATE TABLE IF NOT EXISTS " + TRACKING_TABLE +" ("+PROPERTY_SERVICE+ " varchar(255) NOT NULL, " + PROPERTY_VERSION+" float(4) NOT NULL, " +PROPERTY_SCRIPT+" varchar(255) NOT NULL);")
.then()
.concatWith(databaseClient.execute().sql("CREATE TABLE IF NOT EXISTS " + TRACKING_SEAL_TABLE+" ("+PROPERTY_SERVICE+ " varchar(255) NOT NULL, "+ PROPERTY_VERSION+" float(4) NOT NULL);")
.then())
.doOnComplete(() -> {
log.info("Populating migrations to be executed");// reaches here
databaseClient.select().from(TRACKING_SEAL_TABLE).as(MigrationSealDetails.class).fetch().all() .collectList()
.map()//mapping function
.doOnError(e -> log.log(Level.SEVERE, "EEE", e))
.doOnSuccess(highestSealPerService -> {
log.info("AAA");
databaseClient.select().from(TRACKING_TABLE).as(MigrationDetails.class).fetch().all()
.collectList()
.doOnSuccess(migrationsExecuted -> {
// other code
}).block();
}).block();
}).blockLast();
log.info("CCC");
log.info("CCC");
在任何情况下都应该调用它,因为它是所有响应式调用之后的最后一个操作。 我认为您的代码死锁的问题。 您处于doOnComplete
的反应线程中。 然后您进行另一个阻塞操作来阻塞当前的反应线程并且您收到死锁,因为没有操作可以完成。
如果您编写.block()
,请不要使用 R2DBC,只需使用普通的 JDBC。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.