CompletableFuture никогда не звонит в класс DAO - PullRequest
0 голосов
/ 28 мая 2019

Когда я использую CompletableFuture для проверки соединения с базой данных, вызов класса DAO никогда не происходит. Тема никогда не завершается.

Когда я пытаюсь сделать то же самое в главном потоке с прямым вызовом DAO в классе, он работает просто отлично

Ниже код никогда не завершает звонок

CompletableFuture.supplyAsync(() -> {
    try {
        LOG.info("Testing My DB Connection");
        return this.myDBDao.testConnection();
    } catch(SQLException sqlE) {
        return false;
    }
}, this.asyncExecutor).thenAccept(val -> {
        if(val) {
            LOG.info("My DB Connection Test SUCCESS");
        } else {
            throw new RuntimeException("CONNECTION TO MY DB FAILED");
        }
}).join();

Ниже код работает просто отлично

try {
    if(this.myDBDao.testConnection()) {
        LOG.info("Testing My DB Connection");
    } else {
        throw new RuntimeException("CONNECTION TO MY DB FAILED");
    }
} catch(SQLException sqlE) {
    throw new RuntimeException("CONNECTION TO MY DB FAILED");
}

Метод DAO

private static final String TEST_CON_QUERY = "select 'TRUE' as val from dual";

public boolean testConnection() throws SQLException {
        LOG.info("testConnection from DAO: " + this.jdbcTemplate.getDataSource());
        return this.jdbcTemplate.query(TEST_CON_QUERY, (rs) -> {
            return (rs.next()) ? rs.getBoolean("VAL") : false;
        });
    }

Источник данных и пул соединений

@Bean(name = "myDBTemplate")
    JdbcTemplate myJDBCTemplate() throws SQLException {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(******);
        config.setUsername(******);
        config.setPassword(******);
        config.setMaximumPoolSize(50);
        config.setMinimumIdle(10);
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.setPoolName("myDBPool");
        return new JdbcTemplate(new HikariDataSource(config));
    }

Палач

@Bean(name = "asyncExecutor")
    public ExecutorService getAsyncExecutor() {
        return Executors.newCachedThreadPool();
    }

Почему код внутри CompletableFuture никогда не может вызвать метод testConnection ()?

...