-
Notifications
You must be signed in to change notification settings - Fork 16
/
DefaultWorkflowSchedulingAssistant.java
71 lines (60 loc) · 2.66 KB
/
DefaultWorkflowSchedulingAssistant.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package io.github.jas34.scheduledwf.execution;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import com.netflix.conductor.core.utils.IDGenerator;
import io.github.jas34.scheduledwf.run.Result;
import io.github.jas34.scheduledwf.run.ScheduledWorkFlow;
import io.github.jas34.scheduledwf.run.SchedulingResult;
import io.github.jas34.scheduledwf.run.ShutdownResult;
import io.github.jas34.scheduledwf.run.Status;
import io.github.jas34.scheduledwf.scheduler.ScheduledProcess;
import io.github.jas34.scheduledwf.scheduler.WorkflowScheduler;
import io.github.jas34.scheduledwf.scheduler.WorkflowSchedulerFactory;
/**
* @author Jasbir Singh
*/
public class DefaultWorkflowSchedulingAssistant implements WorkflowSchedulingAssistant {
private WorkflowSchedulerFactory<ScheduledProcess> factory;
public DefaultWorkflowSchedulingAssistant(WorkflowSchedulerFactory<ScheduledProcess> factory) {
this.factory = factory;
}
@Override
public SchedulingResult scheduleSchedulerWithFailSafety(ScheduledWorkFlow scheduledWorkFlow) {
WorkflowScheduler<ScheduledProcess> workflowScheduler =
factory.getWorkflowSchedulerFactory(scheduledWorkFlow);
SchedulingResult result = new SchedulingResult(IDGenerator.generate());
ScheduledProcess scheduledProcess =
executeAndpopulateResult(result, () -> workflowScheduler.schedule(scheduledWorkFlow));
result.setProcessReference(scheduledProcess);
return result;
}
@Override
public ShutdownResult shutdownSchedulerWithFailSafety(ScheduledWorkFlow scheduledWorkFlow) {
WorkflowScheduler<ScheduledProcess> workflowScheduler =
factory.getWorkflowSchedulerFactory(scheduledWorkFlow);
ShutdownResult result = new ShutdownResult(IDGenerator.generate());
executeAndpopulateResult(result,
() -> workflowScheduler.shutdown(scheduledWorkFlow.getScheduledProcess()));
return result;
}
@Override
public List<ShutdownResult> shutdownAllSchedulersWithFailSafety(
List<ScheduledWorkFlow> scheduledWorkFlows) {
List<ShutdownResult> results = new ArrayList<>();
scheduledWorkFlows.forEach(scheduledWorkFlow -> {
results.add(shutdownSchedulerWithFailSafety(scheduledWorkFlow));
});
return results;
}
private <T> T executeAndpopulateResult(Result result, Supplier<T> task) {
result.setStatus(Status.SUCCESS);
try {
return task.get();
} catch (Throwable e) {
result.setStatus(Status.FAILURE);
result.setException(e);
return null;
}
}
}