package foundation.data.meta; import java.util.Date; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.persist.source.NamedDataSource; import foundation.server.config.ServerStatus; import foundation.util.Util; public class MetaMonitor { private NamedDataSource dataSource; private String dataName; private NamedSQL getLastUpdateTimeSQL; private Date lastUpdateTime; private int count; public MetaMonitor(String sqlName) { this(NamedDataSource.getInstance(), null, sqlName); count = 0; } public MetaMonitor(String dataName, String sqlName) { this(NamedDataSource.getInstance(), dataName, sqlName); } public MetaMonitor(NamedDataSource dataSource, String dataName, String sqlName) { this.dataSource = dataSource; this.dataName = dataName; try { getLastUpdateTimeSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName); getLastUpdateTimeSQL.setParam("dataName", dataName); lastUpdateTime = new Date(); lastUpdateTime.setTime(0); } catch (Exception e) { e.printStackTrace(); } } public MetaMonitor(NamedDataSource dataSource, String sqlName) { this.dataSource = dataSource; try { getLastUpdateTimeSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName); lastUpdateTime = new Date(); lastUpdateTime.setTime(0); } catch (Exception e) { e.printStackTrace(); } } public ReloadCheckResult getReloadCheckResult() throws Exception { ReloadCheckResult result = new ReloadCheckResult(false, lastUpdateTime); //1. 如果系统全局设置为不检查,直接退出 if ((!ServerStatus.isCheckMetaUpdateOnTime()) && count > 1) { return result; } //2. 检查是否数据库是否有更新 Date date = SQLRunner.getDate(dataSource, getLastUpdateTimeSQL); if (date == null) { return result; } boolean changed = (date != null) ? (lastUpdateTime.getTime() < date.getTime()) : true; result.setNeedReload(changed); result.setLastUpdateTime(date); count = count + 1; return result; } public ReloadCheckResult getReloadCheckResult(boolean checkMetaUpdate) throws Exception { ReloadCheckResult result = new ReloadCheckResult(false, lastUpdateTime); Date date = SQLRunner.getDate(dataSource, getLastUpdateTimeSQL); if (date == null) { return result; } boolean changed = (date != null) ? (lastUpdateTime.getTime() < date.getTime()) : true; result.setNeedReload(changed); result.setLastUpdateTime(date); count = count + 1; return result; } public Date getLastUpdateTime() { return lastUpdateTime; } public void setLastUpdateTime(Date lastUpdateTime) { if (lastUpdateTime == null) { return; } this.lastUpdateTime = lastUpdateTime; } public void setParam(String name, String value) { getLastUpdateTimeSQL.setParam(name, value); }; public void setRefreshFlag() { lastUpdateTime.setTime(0); } @Override public String toString() { String result = dataName + Util.DataTimeToString(lastUpdateTime); return result; } }