package com.baidu.ub.common.dbmanage.monitor;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.jdbc.core.JdbcTemplate;
import com.baidu.ub.common.dbmanage.datasource.VirtualDataSource;
/**
* @author wangxj
*/
public class DataSourceMonitorTask extends ApplicationObjectSupport {
protected static final Logger log = LoggerFactory.getLogger(DataSourceMonitorTask.class);
@Resource
private List<VirtualDataSource> dataSourceList;
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
public void checkDataSource() {
for (VirtualDataSource vdb : dataSourceList) {
List<String> mkeys = vdb.getMasterSet();
if (CollectionUtils.isNotEmpty(mkeys)) {
List<String> masterKeys = new ArrayList<String>();
for (String dbKey : mkeys) {
log.info("check datasource:" + dbKey);
DataSource ds = getApplicationContext().getBean(dbKey, DataSource.class);
if (isConnect(ds)) {
masterKeys.add(dbKey);
}
}
if (needChange(vdb.getMasterPools(), masterKeys)) {
log.warn("changed ds master pool:" + masterKeys);
vdb.setMasterPools(masterKeys);
}
}
List<String> skeys = vdb.getSlaveSet();
if (CollectionUtils.isNotEmpty(skeys)) {
List<String> slaveKeys = new ArrayList<String>();
for (String dbKey : skeys) {
log.info("check datasource:" + dbKey);
DataSource ds = getApplicationContext().getBean(dbKey, DataSource.class);
if (isConnect(ds)) {
slaveKeys.add(dbKey);
}
}
if (needChange(vdb.getSlavePools(), slaveKeys)) {
log.warn("changed ds slave pool:" + slaveKeys);
vdb.setSlavePools(slaveKeys);
}
}
}
log.info("check datasource done");
}
private boolean isConnect(DataSource dataSource) {
jdbcTemplate.setDataSource(dataSource);
try {
jdbcTemplate.queryForObject("select now() as nowTime", Date.class);
} catch (Throwable t) {
return false;
}
return true;
}
private boolean needChange(List<String> usedList, List<String> newList) {
if (newList == null) {
log.error("all datasource is out of connection!!!");
return false;
}
if (usedList.size() != newList.size()) {
return true;
}
for (String key : usedList) {
if (!newList.contains(key)) {
return true;
}
}
return false;
}
public List<VirtualDataSource> getDataSourceList() {
return dataSourceList;
}
public void setDataSourceList(List<VirtualDataSource> dataSourceList) {
this.dataSourceList = dataSourceList;
}
}