0

代码到达“填充要执行的迁移”日志。然而,没有任何 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");
4

1 回答 1

0

log.info("CCC");

在任何情况下都应该调用它,因为它是所有响应式调用之后的最后一个操作。我认为您的代码死锁的问题。你在一个反应​​线程中doOnComplete。然后您进行另一个阻塞操作来阻塞当前的反应线程并且您收到死锁,因为没有操作可以完成。

.block()如果您只使用普通 JDBC ,请不要使用 R2DBC 。

于 2019-11-28T22:03:11.820 回答