package com.github.ltsopensource.admin.support;
import com.github.ltsopensource.admin.cluster.BackendAppContext;
import com.github.ltsopensource.admin.request.JvmDataReq;
import com.github.ltsopensource.admin.request.MDataPaginationReq;
import com.github.ltsopensource.admin.request.NodeOnOfflineLogPaginationReq;
import com.github.ltsopensource.core.commons.utils.Callable;
import com.github.ltsopensource.core.commons.utils.DateUtils;
import com.github.ltsopensource.core.commons.utils.QuietUtils;
import com.github.ltsopensource.core.factory.NamedThreadFactory;
import com.github.ltsopensource.core.logger.Logger;
import com.github.ltsopensource.core.logger.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 定时清除 monitor 数据
*
* @author Robert HG (254963746@qq.com) on 8/23/15.
*/
public class LtsAdminDataCleaner implements InitializingBean {
private static final Logger LOGGER = LoggerFactory.getLogger(LtsAdminDataCleaner.class);
@Autowired
private BackendAppContext appContext;
private ScheduledExecutorService cleanExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LTS-Admin-Clean", true));
private AtomicBoolean start = new AtomicBoolean(false);
public void start() {
if (start.compareAndSet(false, true)) {
cleanExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
clean();
} catch (Throwable t) {
LOGGER.error("Clean monitor data error ", t);
}
}
}, 1, 24, TimeUnit.HOURS);
LOGGER.info("LtsAdminDataCleaner start succeed ");
}
}
private void clean() {
// 1. 清除TaskTracker JobTracker, JobClient的统计数据(3天之前的)
final MDataPaginationReq request = new MDataPaginationReq();
request.setEndTime(DateUtils.addDay(new Date(), -3).getTime());
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendTaskTrackerMAccess().delete(request);
}
});
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendJobTrackerMAccess().delete(request);
}
});
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendJobClientMAccess().delete(request);
}
});
// 2. 清除30天以前的节点上下线日志
final NodeOnOfflineLogPaginationReq nodeOnOfflineLogPaginationReq = new NodeOnOfflineLogPaginationReq();
nodeOnOfflineLogPaginationReq.setEndLogTime(DateUtils.addDay(new Date(), -30));
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendNodeOnOfflineLogAccess().delete(nodeOnOfflineLogPaginationReq);
}
});
// 3. 清除3天前的JVM监控信息
final JvmDataReq jvmDataReq = new JvmDataReq();
jvmDataReq.setEndTime(DateUtils.addDay(new Date(), -3).getTime());
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendJVMGCAccess().delete(jvmDataReq);
}
});
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendJVMThreadAccess().delete(jvmDataReq);
}
});
QuietUtils.doWithWarn(new Callable() {
@Override
public void call() throws Exception {
appContext.getBackendJVMMemoryAccess().delete(jvmDataReq);
}
});
LOGGER.info("Clean monitor data succeed ");
}
@Override
public void afterPropertiesSet() throws Exception {
start();
}
}