[英]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.