[dev] add protect mechanism for FrequentTaskTracker

This commit is contained in:
tjq 2020-06-26 21:46:49 +08:00
parent ef14c4840f
commit 51e49d0176
2 changed files with 12 additions and 2 deletions

View File

@ -87,6 +87,7 @@ public class InstanceManager {
// 综上直接把 status runningNum 同步到DB即可 // 综上直接把 status runningNum 同步到DB即可
if (TimeExpressionType.frequentTypes.contains(timeExpressionType)) { if (TimeExpressionType.frequentTypes.contains(timeExpressionType)) {
instanceInfo.setResult(req.getResult());
instanceInfo.setRunningTimes(req.getTotalTaskNum()); instanceInfo.setRunningTimes(req.getTotalTaskNum());
instanceInfoRepository.saveAndFlush(instanceInfo); instanceInfoRepository.saveAndFlush(instanceInfo);
return; return;

View File

@ -61,6 +61,7 @@ public class FrequentTaskTracker extends TaskTracker {
private static final int HISTORY_SIZE = 10; private static final int HISTORY_SIZE = 10;
private static final String LAST_TASK_ID_PREFIX = "L"; private static final String LAST_TASK_ID_PREFIX = "L";
private static final int MIN_INTERVAL = 1000;
protected FrequentTaskTracker(ServerScheduleJobReq req) { protected FrequentTaskTracker(ServerScheduleJobReq req) {
super(req); super(req);
@ -89,6 +90,10 @@ public class FrequentTaskTracker extends TaskTracker {
// 2. 启动任务发射器 // 2. 启动任务发射器
launcher = new Launcher(); launcher = new Launcher();
if (timeExpressionType == TimeExpressionType.FIX_RATE) { if (timeExpressionType == TimeExpressionType.FIX_RATE) {
// 固定频率需要设置最小间隔
if (timeParams < MIN_INTERVAL) {
throw new OmsException("time interval too small, please set the timeExpressionInfo >= 1000");
}
scheduledPool.scheduleAtFixedRate(launcher, 1, timeParams, TimeUnit.MILLISECONDS); scheduledPool.scheduleAtFixedRate(launcher, 1, timeParams, TimeUnit.MILLISECONDS);
}else { }else {
scheduledPool.schedule(launcher, 0, TimeUnit.MILLISECONDS); scheduledPool.schedule(launcher, 0, TimeUnit.MILLISECONDS);
@ -97,8 +102,7 @@ public class FrequentTaskTracker extends TaskTracker {
// 3. 启动任务分发器事实上秒级任务应该都是单机任务且感觉不需要失败重试机制那么 Dispatcher 的存在就有点浪费系统资源了... // 3. 启动任务分发器事实上秒级任务应该都是单机任务且感觉不需要失败重试机制那么 Dispatcher 的存在就有点浪费系统资源了...
scheduledPool.scheduleWithFixedDelay(new Dispatcher(), 1, 2, TimeUnit.SECONDS); scheduledPool.scheduleWithFixedDelay(new Dispatcher(), 1, 2, TimeUnit.SECONDS);
// 4. 启动状态检查器 // 4. 启动状态检查器
scheduledPool.scheduleWithFixedDelay(new Checker(), 5000, Math.min(timeParams, 10000), TimeUnit.MILLISECONDS); scheduledPool.scheduleWithFixedDelay(new Checker(), 5000, Math.min(Math.max(timeParams, 5000), 5000), TimeUnit.MILLISECONDS);
} }
@Override @Override
@ -213,6 +217,11 @@ public class FrequentTaskTracker extends TaskTracker {
@Override @Override
public void run() { public void run() {
if (finished.get()) {
return;
}
try { try {
checkStatus(); checkStatus();
reportStatus(); reportStatus();