Skip to content

Commit 762804f

Browse files
committed
refactor savepoint
1 parent f9d9833 commit 762804f

File tree

18 files changed

+83
-54
lines changed

18 files changed

+83
-54
lines changed

disjob-core/src/main/java/cn/ponfee/disjob/core/base/SupervisorCoreRpcService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
*/
3030
@Hidden
3131
@RequestMapping("supervisor/core/rpc/")
32-
public interface SupervisorCoreRpcService extends Savepoint {
32+
public interface SupervisorCoreRpcService {
3333

3434
@GetMapping("task/get")
3535
SchedTask getTask(long taskId) throws Exception;
@@ -62,8 +62,7 @@ public interface SupervisorCoreRpcService extends Savepoint {
6262

6363
// ---------------------------------------------------------------------------savepoint
6464

65-
@Override
6665
@PostMapping("task/savepoint")
67-
void save(long taskId, String executeSnapshot) throws Exception;
66+
void savepoint(long taskId, String executeSnapshot) throws Exception;
6867

6968
}

disjob-core/src/main/java/cn/ponfee/disjob/core/handle/Savepoint.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ public interface Savepoint {
1919
/**
2020
* Save the task execution snapshot
2121
*
22-
* @param taskId the task id
23-
* @param executeSnapshot the execution snapshot data
22+
* @param executeSnapshot the task execution snapshot data
2423
* @throws Exception if saved occur exception
2524
*/
26-
void save(long taskId, String executeSnapshot) throws Exception;
25+
void save(String executeSnapshot) throws Exception;
2726

28-
Savepoint DISCARD = (taskId, executeSnapshot) -> {};
27+
Savepoint DISCARD = executeSnapshot -> {};
2928
}

disjob-core/src/main/java/cn/ponfee/disjob/core/model/SchedJob.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ public class SchedJob extends BaseEntity implements Serializable {
182182
*/
183183
private String createdBy;
184184

185+
public Long obtainNextTriggerTime() {
186+
if (nextTriggerTime == null || endTime == null) {
187+
return nextTriggerTime;
188+
}
189+
return nextTriggerTime > endTime.getTime() ? null : nextTriggerTime;
190+
}
191+
185192
public void verifyBeforeAdd() {
186193
TriggerType type = TriggerType.of(triggerType);
187194
if (!type.validate(triggerValue)) {

disjob-registry/disjob-registry-database/src/main/java/cn/ponfee/disjob/registry/database/DatabaseServerRegistry.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ public abstract class DatabaseServerRegistry<R extends Server, D extends Server>
5151

5252
private static final String REMOVE_DEAD_SQL = "DELETE FROM " + TABLE_NAME + " WHERE namespace=? AND role=? AND heartbeat_time<?";
5353

54-
private static final String REGISTER_SQL = "INSERT INTO " + TABLE_NAME + " (namespace, role, server, heartbeat_time) VALUES (?, ?, ?, ?)";
54+
private static final String REGISTER_SQL = "INSERT INTO " + TABLE_NAME + " (namespace, role, server, heartbeat_time) VALUES (?, ?, ?, ?)";
5555

56-
private static final String HEARTBEAT_SQL = "UPDATE " + TABLE_NAME + " SET heartbeat_time=? WHERE namespace=? AND role=? AND server=?";
56+
private static final String HEARTBEAT_SQL = "UPDATE " + TABLE_NAME + " SET heartbeat_time=? WHERE namespace=? AND role=? AND server=?";
5757

58-
private static final String DEREGISTER_SQL = "DELETE FROM " + TABLE_NAME + " WHERE namespace=? AND role=? AND server=?";
58+
private static final String DEREGISTER_SQL = "DELETE FROM " + TABLE_NAME + " WHERE namespace=? AND role=? AND server=?";
5959

60-
private static final String DISCOVER_SQL = "SELECT server FROM " + TABLE_NAME + " WHERE namespace=? AND role=? AND heartbeat_time>?";
60+
private static final String DISCOVER_SQL = "SELECT server FROM " + TABLE_NAME + " WHERE namespace=? AND role=? AND heartbeat_time>?";
6161

6262
/**
6363
* Registry namespace

disjob-supervisor/src/main/java/cn/ponfee/disjob/supervisor/provider/SupervisorCoreRpcProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public boolean cancelInstance(long instanceId, Operations ops) {
7373
}
7474

7575
@Override
76-
public void save(long taskId, String executeSnapshot) {
76+
public void savepoint(long taskId, String executeSnapshot) {
7777
jobManager.savepoint(taskId, executeSnapshot);
7878
}
7979

disjob-supervisor/src/main/java/cn/ponfee/disjob/supervisor/service/AbstractJobManager.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,9 @@ public boolean disableJob(SchedJob job) {
7676

7777
public boolean changeJobState(long jobId, JobState to) {
7878
boolean flag = isOneAffectedRow(jobMapper.updateState(jobId, to.value(), 1 ^ to.value()));
79-
SchedJob job;
80-
if (flag && to == JobState.ENABLE && TriggerType.FIXED_DELAY.equals((job = jobMapper.get(jobId)).getTriggerType())) {
81-
Date date = null;
82-
if (job.getLastTriggerTime() != null) {
83-
date = TriggerType.FIXED_DELAY.computeNextTriggerTime(job.getTriggerValue(), new Date(job.getLastTriggerTime()));
84-
}
85-
Date nextTriggerTime = Dates.max(new Date(), job.getStartTime(), date);
86-
jobMapper.updateFixedDelayNextTriggerTime(jobId, nextTriggerTime.getTime());
79+
if (flag && to == JobState.ENABLE) {
80+
SchedJob job = jobMapper.get(jobId);
81+
updateFixedDelayNextTriggerTime(job, Dates.ofTimeMillis(job.getLastTriggerTime()));
8782
}
8883
return flag;
8984
}
@@ -151,6 +146,16 @@ public void deleteJob(long jobId) {
151146

152147
// ------------------------------------------------------------------others operation
153148

149+
protected boolean updateFixedDelayNextTriggerTime(SchedJob job, Date baseTime) {
150+
TriggerType fixedDelay = TriggerType.FIXED_DELAY;
151+
if (!fixedDelay.equals(job.getTriggerType())) {
152+
return false;
153+
}
154+
Date date = baseTime == null ? null : fixedDelay.computeNextTriggerTime(job.getTriggerValue(), baseTime);
155+
Date nextTriggerTime = Dates.max(new Date(), job.getStartTime(), date);
156+
return isOneAffectedRow(jobMapper.updateFixedDelayNextTriggerTime(job.getJobId(), nextTriggerTime.getTime()));
157+
}
158+
154159
protected boolean isOneAffectedRow(int totalAffectedRow) {
155160
return totalAffectedRow == AFFECTED_ONE_ROW;
156161
}

disjob-supervisor/src/main/java/cn/ponfee/disjob/supervisor/service/DistributedJobManager.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -718,14 +718,12 @@ private void updateFixedDelayNextTriggerTime(SchedInstance curr, LazyLoader<Sche
718718

719719
// 3、如果是可重试,则要等到最后的那次重试完时来计算下次的延时执行时间
720720
SchedJob job = lazyJob.orElse(null);
721-
if ( job == null
722-
|| !TriggerType.FIXED_DELAY.equals(job.getTriggerType())
723-
|| job.retryable(RunState.of(curr.getRunState()), curr.obtainRetriedCount())) {
721+
if (job == null || job.retryable(RunState.of(curr.getRunState()), curr.obtainRetriedCount())) {
724722
return;
725723
}
726724

727-
Date nextTriggerTime = TriggerType.FIXED_DELAY.computeNextTriggerTime(job.getTriggerValue(), curr.getRunEndTime());
728-
jobMapper.updateFixedDelayNextTriggerTime(job.getJobId(), nextTriggerTime.getTime());
725+
// 4、do update nextTriggerTime
726+
super.updateFixedDelayNextTriggerTime(job, curr.getRunEndTime());
729727
}
730728

731729
private void processWorkflow(SchedInstance nodeInstance) {

disjob-supervisor/src/main/java/cn/ponfee/disjob/supervisor/thread/TriggeringJobScanner.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ private void processJob(SchedJob job, Date now, long maxNextTriggerTime) {
179179
private Long reComputeNextTriggerTime(SchedJob job, Date now) {
180180
if (TriggerType.FIXED_DELAY.equals(job.getTriggerType())) {
181181
// 固定延时类型不重新计算nextTriggerTime
182-
return job.getNextTriggerTime();
182+
return job.obtainNextTriggerTime();
183183
}
184184
if (now.getTime() <= (job.getNextTriggerTime() + afterMilliseconds)) {
185185
// 没有过期不重新计算nextTriggerTime
@@ -199,6 +199,7 @@ private Long reComputeNextTriggerTime(SchedJob job, Date now) {
199199
private static Long doComputeNextTriggerTime(SchedJob job, Date now) {
200200
if (TriggerType.FIXED_DELAY.equals(job.getTriggerType())) {
201201
// 固定延时类型的nextTriggerTime:先更新为long最大值,当任务实例运行完成时去主动计算并更新
202+
// null值已被用作表示没有下次触发时间
202203
return Long.MAX_VALUE;
203204
}
204205
return TriggerTimeUtils.computeNextTriggerTime(job, now);

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/AJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<SplitTask> split(String jobParamString) {
5050
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
5151
Thread.sleep(ThreadLocalRandom.current().nextInt(5000) + 1000);
5252
LOG.info(this.getClass().getSimpleName() + " execution finished.");
53-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
53+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5454
return ExecuteResult.success();
5555
}
5656

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/BJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<SplitTask> split(String jobParamString) {
5050
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
5151
Thread.sleep(ThreadLocalRandom.current().nextInt(5000) + 1000);
5252
LOG.info(this.getClass().getSimpleName() + " execution finished.");
53-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
53+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5454
return ExecuteResult.success();
5555
}
5656

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/CJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<SplitTask> split(String jobParamString) {
5050
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
5151
Thread.sleep(ThreadLocalRandom.current().nextInt(5000) + 1000);
5252
LOG.info(this.getClass().getSimpleName() + " execution finished.");
53-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
53+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5454
return ExecuteResult.success();
5555
}
5656

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/DJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<SplitTask> split(String jobParamString) {
5050
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
5151
Thread.sleep(ThreadLocalRandom.current().nextInt(5000) + 1000);
5252
LOG.info(this.getClass().getSimpleName() + " execution finished.");
53-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
53+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5454
return ExecuteResult.success();
5555
}
5656

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/EJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<SplitTask> split(String jobParamString) {
5050
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
5151
Thread.sleep(ThreadLocalRandom.current().nextInt(5000) + 1000);
5252
LOG.info(this.getClass().getSimpleName() + " execution finished.");
53-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
53+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5454
return ExecuteResult.success();
5555
}
5656

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/NoopJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) t
5252
LOG.info("task execute start: {}", executingTask.getTaskId());
5353
Thread.sleep(major + ThreadLocalRandom.current().nextLong(minor));
5454
LOG.info("task execute done: {}", executingTask.getTaskId());
55-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
55+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
5656
return ExecuteResult.success();
5757
}
5858

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/PrimeAccumulateJobHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
package cn.ponfee.disjob.test.handler;
1010

1111
import cn.ponfee.disjob.common.util.Jsons;
12+
import cn.ponfee.disjob.core.enums.RunState;
1213
import cn.ponfee.disjob.core.handle.ExecuteResult;
1314
import cn.ponfee.disjob.core.handle.JobHandler;
1415
import cn.ponfee.disjob.core.handle.Savepoint;
1516
import cn.ponfee.disjob.core.handle.execution.AbstractExecutionTask;
1617
import cn.ponfee.disjob.core.handle.execution.ExecutingTask;
18+
import org.springframework.util.Assert;
1719

1820
/**
1921
* 质数计数后的累加器
@@ -26,12 +28,13 @@ public class PrimeAccumulateJobHandler extends JobHandler {
2628
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
2729
long sum = executingTask.getWorkflowPredecessorNodes()
2830
.stream()
31+
.peek(e -> Assert.state(RunState.FINISHED.equals(e.getRunState()), "Previous instance unfinished: " + e.getInstanceId()))
2932
.flatMap(e -> e.getExecutedTasks().stream())
3033
.map(AbstractExecutionTask::getExecuteSnapshot)
3134
.map(e -> Jsons.fromJson(e, PrimeCountJobHandler.ExecuteSnapshot.class))
3235
.mapToLong(PrimeCountJobHandler.ExecuteSnapshot::getCount)
3336
.sum();
34-
savepoint.save(executingTask.getTaskId(), Long.toString(sum));
37+
savepoint.save(Long.toString(sum));
3538

3639
return ExecuteResult.success();
3740
}

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/PrimeCountJobHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) t
108108
long nextSavepointTimeMillis = System.currentTimeMillis() + SAVEPOINT_INTERVAL_MS;
109109
while (next <= n) {
110110
if (super.isStopped() || Thread.currentThread().isInterrupted()) {
111-
savepoint.save(executingTask.getTaskId(), Jsons.toJson(execution));
111+
savepoint.save(Jsons.toJson(execution));
112112
throw new PauseTaskException(JobCodeMsg.PAUSE_TASK_EXCEPTION);
113113
}
114114

@@ -124,7 +124,7 @@ public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) t
124124
}
125125

126126
if (execution.isFinished() || nextSavepointTimeMillis < System.currentTimeMillis()) {
127-
savepoint.save(executingTask.getTaskId(), Jsons.toJson(execution));
127+
savepoint.save(Jsons.toJson(execution));
128128
nextSavepointTimeMillis = System.currentTimeMillis() + SAVEPOINT_INTERVAL_MS;
129129
}
130130
}

disjob-test/src/main/java/cn/ponfee/disjob/test/handler/TestBroadcastJobHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void init(ExecutingTask executingTask) {
3737
public ExecuteResult execute(ExecutingTask executingTask, Savepoint savepoint) throws Exception {
3838
Thread.sleep(5000 + ThreadLocalRandom.current().nextLong(10000));
3939
LOG.info("Broadcast job execute done: {}", executingTask.getTaskId());
40-
savepoint.save(executingTask.getTaskId(), Dates.format(new Date()) + ": " + getClass().getSimpleName());
40+
savepoint.save(Dates.format(new Date()) + ": " + getClass().getSimpleName());
4141
return ExecuteResult.success();
4242
}
4343

0 commit comments

Comments
 (0)