123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- package com.xxl.job.admin.core.thread;
- import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
- import com.xxl.job.admin.core.model.XxlJobLogReport;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import java.util.concurrent.TimeUnit;
- /**
- * job log report helper
- *
- * @author xuxueli 2019-11-22
- */
- public class JobLogReportHelper {
- private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
- private static JobLogReportHelper instance = new JobLogReportHelper();
- public static JobLogReportHelper getInstance(){
- return instance;
- }
- private Thread logrThread;
- private volatile boolean toStop = false;
- public void start(){
- logrThread = new Thread(new Runnable() {
- @Override
- public void run() {
- // last clean log time
- long lastCleanLogTime = 0;
- while (!toStop) {
- // 1、log-report refresh: refresh log report in 3 days
- try {
- for (int i = 0; i < 3; i++) {
- // today
- Calendar itemDay = Calendar.getInstance();
- itemDay.add(Calendar.DAY_OF_MONTH, -i);
- itemDay.set(Calendar.HOUR_OF_DAY, 0);
- itemDay.set(Calendar.MINUTE, 0);
- itemDay.set(Calendar.SECOND, 0);
- itemDay.set(Calendar.MILLISECOND, 0);
- Date todayFrom = itemDay.getTime();
- itemDay.set(Calendar.HOUR_OF_DAY, 23);
- itemDay.set(Calendar.MINUTE, 59);
- itemDay.set(Calendar.SECOND, 59);
- itemDay.set(Calendar.MILLISECOND, 999);
- Date todayTo = itemDay.getTime();
- // refresh log-report every minute
- XxlJobLogReport xxlJobLogReport = new XxlJobLogReport();
- xxlJobLogReport.setTriggerDay(todayFrom);
- xxlJobLogReport.setRunningCount(0);
- xxlJobLogReport.setSucCount(0);
- xxlJobLogReport.setFailCount(0);
- Map<String, Object> triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLogReport(todayFrom, todayTo);
- if (triggerCountMap!=null && triggerCountMap.size()>0) {
- int triggerDayCount = triggerCountMap.containsKey("triggerDayCount")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))):0;
- int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))):0;
- int triggerDayCountSuc = triggerCountMap.containsKey("triggerDayCountSuc")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountSuc"))):0;
- int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc;
- xxlJobLogReport.setRunningCount(triggerDayCountRunning);
- xxlJobLogReport.setSucCount(triggerDayCountSuc);
- xxlJobLogReport.setFailCount(triggerDayCountFail);
- }
- // do refresh
- int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport);
- if (ret < 1) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport);
- }
- }
- } catch (Exception e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job log report thread error:{}", e);
- }
- }
- // 2、log-clean: switch open & once each day
- if (XxlJobAdminConfig.getAdminConfig().getLogretentiondays()>0
- && System.currentTimeMillis() - lastCleanLogTime > 24*60*60*1000) {
- // expire-time
- Calendar expiredDay = Calendar.getInstance();
- expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminConfig.getAdminConfig().getLogretentiondays());
- expiredDay.set(Calendar.HOUR_OF_DAY, 0);
- expiredDay.set(Calendar.MINUTE, 0);
- expiredDay.set(Calendar.SECOND, 0);
- expiredDay.set(Calendar.MILLISECOND, 0);
- Date clearBeforeTime = expiredDay.getTime();
- // clean expired log
- List<Long> logIds = null;
- do {
- logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
- if (logIds!=null && logIds.size()>0) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds);
- }
- } while (logIds!=null && logIds.size()>0);
- // update clean time
- lastCleanLogTime = System.currentTimeMillis();
- }
- try {
- TimeUnit.MINUTES.sleep(1);
- } catch (Exception e) {
- if (!toStop) {
- logger.error(e.getMessage(), e);
- }
- }
- }
- logger.info(">>>>>>>>>>> xxl-job, job log report thread stop");
- }
- });
- logrThread.setDaemon(true);
- logrThread.setName("xxl-job, admin JobLogReportHelper");
- logrThread.start();
- }
- public void toStop(){
- toStop = true;
- // interrupt and wait
- logrThread.interrupt();
- try {
- logrThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
- }
|