From ecaaacb7fc68b237585bd2ed7b53b6270df88e0e Mon Sep 17 00:00:00 2001 From: littlezhou Date: Thu, 26 Apr 2018 17:09:04 +0800 Subject: [PATCH] Solve #1707, Refine handling of AT-trigger rule --- .../model/rule/TimeBasedScheduleInfo.java | 15 +++++++++- .../server/engine/rule/ExecutorScheduler.java | 1 + .../server/engine/rule/RuleExecutor.java | 29 ++++++++++++++----- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/smart-common/src/main/java/org/smartdata/model/rule/TimeBasedScheduleInfo.java b/smart-common/src/main/java/org/smartdata/model/rule/TimeBasedScheduleInfo.java index e8d550790b9..7bc1c847744 100644 --- a/smart-common/src/main/java/org/smartdata/model/rule/TimeBasedScheduleInfo.java +++ b/smart-common/src/main/java/org/smartdata/model/rule/TimeBasedScheduleInfo.java @@ -22,6 +22,7 @@ public class TimeBasedScheduleInfo { private long startTime; private long endTime; private long every; + private long subScheduleTime; public TimeBasedScheduleInfo() { } @@ -56,7 +57,19 @@ public long getEvery() { return every; } - public boolean isOneShot() { + public boolean isOnce() { return startTime == endTime && startTime == 0 && every == 0; } + + public boolean isOneShot() { + return startTime == endTime && every == 0; + } + + public void setSubScheduleTime(long subScheduleTime) { + this.subScheduleTime = subScheduleTime; + } + + public long getSubScheduleTime() { + return subScheduleTime; + } } diff --git a/smart-engine/src/main/java/org/smartdata/server/engine/rule/ExecutorScheduler.java b/smart-engine/src/main/java/org/smartdata/server/engine/rule/ExecutorScheduler.java index 72a48abc0d2..25883555695 100644 --- a/smart-engine/src/main/java/org/smartdata/server/engine/rule/ExecutorScheduler.java +++ b/smart-engine/src/main/java/org/smartdata/server/engine/rule/ExecutorScheduler.java @@ -38,6 +38,7 @@ public ExecutorScheduler(int numThreads) { public void addPeriodicityTask(RuleExecutor re) { TimeBasedScheduleInfo si = re.getTranslateResult().getTbScheduleInfo(); long now = System.currentTimeMillis(); + si.setSubScheduleTime(now); long startDelay = si.getStartTime() - now; if (startDelay < 0) { startDelay = 0; diff --git a/smart-engine/src/main/java/org/smartdata/server/engine/rule/RuleExecutor.java b/smart-engine/src/main/java/org/smartdata/server/engine/rule/RuleExecutor.java index 54c25dc9f63..6677e326f5a 100644 --- a/smart-engine/src/main/java/org/smartdata/server/engine/rule/RuleExecutor.java +++ b/smart-engine/src/main/java/org/smartdata/server/engine/rule/RuleExecutor.java @@ -229,6 +229,7 @@ private List getAccessCountTablesDuringLast(long lastInterval) { @Override public void run() { + long startCheckTime = System.currentTimeMillis(); if (exited) { exitSchedule(); } @@ -237,7 +238,6 @@ public void run() { long rid = ctx.getRuleId(); try { - long startCheckTime = System.currentTimeMillis(); if (ruleManager.isClosed()) { exitSchedule(); } @@ -265,12 +265,21 @@ public void run() { } TimeBasedScheduleInfo scheduleInfo = tr.getTbScheduleInfo(); - if (scheduleInfo.getEndTime() != TimeBasedScheduleInfo.FOR_EVER - && !scheduleInfo.isOneShot() - && startCheckTime - scheduleInfo.getEndTime() > 0) { - LOG.info("Rule " + ctx.getRuleId() + " exit rule executor due to time passed or finished"); - ruleManager.updateRuleInfo(rid, RuleState.FINISHED, System.currentTimeMillis(), 0, 0); - exitSchedule(); + if (!scheduleInfo.isOnce() && scheduleInfo.getEndTime() != TimeBasedScheduleInfo.FOR_EVER) { + boolean befExit = false; + if (scheduleInfo.isOneShot()) { + if (scheduleInfo.getSubScheduleTime() > scheduleInfo.getStartTime()) { + befExit = true; + } + } else if (startCheckTime - scheduleInfo.getEndTime() > 0) { + befExit = true; + } + + if (befExit) { + LOG.info("Rule " + ctx.getRuleId() + " exit rule executor due to time passed"); + ruleManager.updateRuleInfo(rid, RuleState.FINISHED, System.currentTimeMillis(), 0, 0); + exitSchedule(); + } } if (doExec) { @@ -309,6 +318,12 @@ public void run() { exitSchedule(); } + if (endProcessTime + scheduleInfo.getEvery() > scheduleInfo.getEndTime()) { + LOG.info("Rule " + ctx.getRuleId() + " exit rule executor due to finished"); + ruleManager.updateRuleInfo(rid, RuleState.FINISHED, System.currentTimeMillis(), 0, 0); + exitSchedule(); + } + if (exited) { exitSchedule(); }