Parcourir la source

完善定时器的改造

andyliu il y a 1 semaine
Parent
commit
5ad60123b7

+ 44 - 12
src/main/java/com/shkpr/service/warncore/bizhandler/TimerCheckWarnPlanMgr.java

@@ -28,18 +28,32 @@ public class TimerCheckWarnPlanMgr {
         return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanRulesDBService.class);
     }
 
-    public static void checkWarnPlanByMinute(int curClock, int curMinute){
+    public static void checkWarnPlanByFrequency(int curClock, int curMinute, String frequencyUnit){
+        int curTmForCompare = 1;
+        String tmFiler = "";
+        if (FrequencyUnit.MIN.equals(frequencyUnit)){
+            curTmForCompare = curMinute;
+            String.format("and %s <= %d "
+                    , OrdWarnPlanInfoTable.W_INFO.FREQUENCY
+                    , curTmForCompare);
+        }else if (FrequencyUnit.HOUR.equals(frequencyUnit)){
+            curTmForCompare = curClock;
+            String.format("and %s <= %d "
+                    , OrdWarnPlanInfoTable.W_INFO.FREQUENCY
+                    , curTmForCompare);
+        }
+
         long thisDayBegin = TimeTool.getTodayBeginUTC();
+        final int preMonthInYear = TimeTool.getYearIndex(TimeTool.getTimeChgMonth(thisDayBegin, -1));//前一月所在的年份
+        final int preDayInMonth = TimeTool.getMonthIndex(thisDayBegin-TimeTool.MS_ONE_DAY);//前一日所在的月份
         Map<String, Object> mapSel = getThisDBService().totalWillAnalysisCounts(new HashMap<String, Object>(){{
                     put(OrdWarnPlanInfoTable.R_INFO.STATUS, CommFieldStatus.ENABLE);
                     put(OrdWarnPlanInfoTable.R_INFO.DISUSED, 0);
-                    put(OrdWarnPlanInfoTable.R_INFO.FREQUENCY_UNIT, FrequencyUnit.MIN);
+                    put(OrdWarnPlanInfoTable.R_INFO.FREQUENCY_UNIT, frequencyUnit);
                 }}
                 , null
                 , ""
-                , String.format("and %s <= %d "
-                        , OrdWarnPlanInfoTable.W_INFO.FREQUENCY
-                        , curMinute));
+                , tmFiler);
 
         if (mapSel != null && mapSel.size() > 0){
             CommTotalMinMax oTotal = FastJsonUtil.map2Obj(mapSel, CommTotalMinMax.class, true);
@@ -75,24 +89,42 @@ public class TimerCheckWarnPlanMgr {
                         if (oItem.getId() > curIndex)
                             curIndex = oItem.getId();
 
+                        if (!FrequencyUnit.MIN.equals(frequencyUnit) && !FrequencyUnit.HOUR.equals(frequencyUnit)){
+                            curTmForCompare = oItem.getFrequency();
+                        }
+
                         if (oItem.getStatus() != CommFieldStatus.ENABLE
                                 || oItem.getFrequency() <= 0
-                                || !FrequencyUnit.MIN.equals(oItem.getFrequencyUnit())
-                                || oItem.getFrequency() > curMinute
-                                || (curMinute%oItem.getFrequency() != 0))
+                                || !frequencyUnit.equals(oItem.getFrequencyUnit())
+                                || oItem.getFrequency() > curTmForCompare
+                                || (curTmForCompare%oItem.getFrequency() != 0))
                             continue;
 
                         //if (DoPeriodUnit.HOUR.equals(oItem.getDoPeriodUnit())){
                             if (oItem.getCycleTriggerUpperTimes() >= 0){
                                 if (oItem.getCycleTriggerUpperTimes() == 0)
                                     continue;
-                                if (oItem.getLastEventTime() >= thisDayBegin
-                                        && oItem.getCycleTriggerTimes() >= oItem.getCycleTriggerUpperTimes()){
-                                    continue;
+                                if (FrequencyUnit.MIN.equals(frequencyUnit) || FrequencyUnit.HOUR.equals(frequencyUnit)){
+                                    if (oItem.getLastEventTime() >= thisDayBegin
+                                            && oItem.getCycleTriggerTimes() >= oItem.getCycleTriggerUpperTimes()){
+                                        continue;
+                                    }
+                                }else if (FrequencyUnit.DAY.equals(frequencyUnit) && oItem.getLastEventTime() > 0L){
+                                    int lastEventTmInMonth = TimeTool.getMonthIndex(oItem.getLastEventTime());
+                                    if (lastEventTmInMonth == preDayInMonth
+                                            && oItem.getCycleTriggerTimes() >= oItem.getCycleTriggerUpperTimes()){
+                                        continue;
+                                    }
+                                }else if (FrequencyUnit.MONTH.equals(frequencyUnit) && oItem.getLastEventTime() > 0L){
+                                    int lastEventTmInYear = TimeTool.getYearIndex(oItem.getLastEventTime());
+                                    if (lastEventTmInYear == preMonthInYear
+                                            && oItem.getCycleTriggerTimes() >= oItem.getCycleTriggerUpperTimes()){
+                                        continue;
+                                    }
                                 }
                             }
 
-                            if (curClock < oItem.getMinStarts())
+                            if (DoPeriodUnit.HOUR.equals(oItem.getDoPeriodUnit()) && curClock < oItem.getMinStarts())
                                 continue;
                         //}
                         AsyncTaskQueueMgr.getInstance().postTaskData(TaskQueueDataTypeEx.ASYNC_ANALY_WARN_PLAN, new OrdWarnPlanWillDo(oItem.getUid(), oItem.getObjSrc()));

+ 27 - 1
src/main/java/com/shkpr/service/warncore/globalmgr/ScheduleTaskMgr.java

@@ -6,6 +6,7 @@ import com.shkpr.service.warncore.bizhandler.TimerCheckWarnPlanMgr;
 import com.shkpr.service.warncore.commtools.TimeTool;
 import com.shkpr.service.warncore.components.LocalDynamicDataSource;
 import com.shkpr.service.warncore.components.locks.OrdWarnPlanLockMgr;
+import com.shkpr.service.warncore.constants.FrequencyUnit;
 import com.shkpr.service.warncore.constants.LogFlagBusiType;
 import com.shkpr.service.warncore.dto.TraceRunnable;
 import com.zaxxer.hikari.HikariDataSource;
@@ -68,7 +69,7 @@ public class ScheduleTaskMgr {
         ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WARN.PLAN.BY.MIN") {
             @Override
             public void function() {
-                TimerCheckWarnPlanMgr.checkWarnPlanByMinute(curClock, curMinute==0?60:curMinute);
+                TimerCheckWarnPlanMgr.checkWarnPlanByFrequency(curClock, curMinute==0?60:curMinute, FrequencyUnit.MIN);
             }
         });
     }
@@ -78,6 +79,12 @@ public class ScheduleTaskMgr {
         final long curTm = System.currentTimeMillis();
         final int curMinute = (int)(curTm/1000/60%60);//获取当前分钟数
         final int curClock = (int)((curTm/1000/60/60%24+8)%24);//获取当前小时数
+        ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WARN.PLAN.BY.HOUR") {
+            @Override
+            public void function() {
+                TimerCheckWarnPlanMgr.checkWarnPlanByFrequency(curClock, curMinute==0?60:curMinute, FrequencyUnit.HOUR);
+            }
+        });
     }
 
     @Scheduled(cron = "${cron.check.day.warn}")
@@ -85,6 +92,25 @@ public class ScheduleTaskMgr {
         final long curTm = System.currentTimeMillis();
         final int curMinute = (int)(curTm/1000/60%60);//获取当前分钟数
         final int curClock = (int)((curTm/1000/60/60%24+8)%24);//获取当前小时数
+        ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WARN.PLAN.BY.DAY") {
+            @Override
+            public void function() {
+                TimerCheckWarnPlanMgr.checkWarnPlanByFrequency(curClock, curMinute==0?60:curMinute, FrequencyUnit.DAY);
+            }
+        });
+    }
+
+    @Scheduled(cron = "${cron.check.month.warn}")
+    public void checkWarnPlanByMonth(){
+        final long curTm = System.currentTimeMillis();
+        final int curMinute = (int)(curTm/1000/60%60);//获取当前分钟数
+        final int curClock = (int)((curTm/1000/60/60%24+8)%24);//获取当前小时数
+        ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WARN.PLAN.BY.MONTH") {
+            @Override
+            public void function() {
+                TimerCheckWarnPlanMgr.checkWarnPlanByFrequency(curClock, curMinute==0?60:curMinute, FrequencyUnit.MONTH);
+            }
+        });
     }
 
     @Scheduled(cron = "0 0/10 * * * ?")