繁体   English   中英

R2DBC 数据库客户端未调用 doOnSuccess 或终止嵌套调用

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM