package org.apereo.cas.monitor; import com.google.common.base.Throwables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import java.sql.ResultSet; import java.util.concurrent.ExecutorService; /** * Monitors a data source that describes a single connection or connection pool to a database. * * @author Marvin S. Addison * @since 3.5.1 */ public class JdbcDataSourceMonitor extends AbstractPoolMonitor { private static final Logger LOGGER = LoggerFactory.getLogger(JdbcDataSourceMonitor.class); private JdbcTemplate jdbcTemplate; private final String validationQuery; /** * Creates a new instance that monitors the given data source. * * @param executorService the executor service * @param maxWait the max wait * @param dataSource Data source to monitor. * @param validationQuery validation query used to monitor the data source. The validation query * should return at least one result; otherwise results are ignored. */ public JdbcDataSourceMonitor(final ExecutorService executorService, final int maxWait, final DataSource dataSource, final String validationQuery) { super(JdbcDataSourceMonitor.class.getSimpleName(), executorService, maxWait); if (dataSource != null) { this.jdbcTemplate = new JdbcTemplate(dataSource); } else { LOGGER.debug("No data source is defined to monitor"); } this.validationQuery = validationQuery; } @Override protected StatusCode checkPool() throws Exception { try { return this.jdbcTemplate.query(this.validationQuery, (ResultSet rs) -> { if (rs.next()) { return StatusCode.OK; } return StatusCode.WARN; }); } catch (final Exception e) { throw Throwables.propagate(e); } } @Override protected int getIdleCount() { return PoolStatus.UNKNOWN_COUNT; } @Override protected int getActiveCount() { return PoolStatus.UNKNOWN_COUNT; } }