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 package org.bitrepository.service.scheduler;
26
27 import org.bitrepository.common.utils.TimeUtils;
28 import org.bitrepository.service.workflow.JobID;
29 import org.bitrepository.service.workflow.JobTimerTask;
30 import org.bitrepository.service.workflow.SchedulableJob;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import java.util.*;
35
36
37
38
39 public class TimerbasedScheduler implements JobScheduler {
40 private Logger log = LoggerFactory.getLogger(getClass());
41
42
43 private final Timer timer;
44
45 private Map<JobID, JobTimerTask> intervalTasks = new HashMap<JobID, JobTimerTask>();
46 public static final long SCHEDULE_INTERVAL = 60000;
47
48
49 private static final String TIMER_NAME = "Service Scheduler";
50
51 private static final boolean TIMER_IS_DEAMON = false;
52
53 private static final Long NO_DELAY = 0L;
54 private List<JobEventListener> jobListeners = new LinkedList<JobEventListener>();
55
56
57
58 public TimerbasedScheduler() {
59 timer = new Timer(TIMER_NAME, TIMER_IS_DEAMON);
60 }
61
62 @Override
63 public void schedule(SchedulableJob workflow, Long interval) {
64 log.info("Scheduling job : " + workflow.getJobID() + " to run every " + TimeUtils.millisecondsToHuman(interval));
65
66 JobTimerTask task = new JobTimerTask(interval, workflow, Collections.unmodifiableList(jobListeners));
67 timer.scheduleAtFixedRate(task, NO_DELAY, SCHEDULE_INTERVAL);
68 intervalTasks.put(workflow.getJobID(), task);
69 }
70
71 @Override
72 public String startJob(SchedulableJob job) {
73 long timeBetweenRuns = -1;
74 JobTimerTask oldTask = cancelJob(job.getJobID());
75 if (oldTask != null) {
76 timeBetweenRuns = oldTask.getIntervalBetweenRuns();
77 }
78
79 JobTimerTask task = new JobTimerTask(timeBetweenRuns, job, jobListeners);
80 timer.scheduleAtFixedRate(task, NO_DELAY, SCHEDULE_INTERVAL);
81 intervalTasks.put(job.getJobID(), task);
82 return null;
83 }
84
85 @Override
86 public Date getNextRun(JobID jobId) {
87 if (intervalTasks.containsKey(jobId)) {
88 return intervalTasks.get(jobId).getNextRun();
89 } else return null;
90 }
91
92 @Override
93 public long getRunInterval(JobID jobId) {
94 if (intervalTasks.containsKey(jobId)) {
95 return intervalTasks.get(jobId).getIntervalBetweenRuns();
96 } else return -1;
97 }
98
99 @Override
100 public void addJobEventListener(JobEventListener listener) {
101 jobListeners.add(listener);
102 }
103
104 @Override
105 public JobTimerTask cancelJob(JobID jobID) {
106 JobTimerTask task = intervalTasks.remove(jobID);
107 if(task == null) {
108 return null;
109 }
110 task.cancel();
111
112 return task;
113 }
114 }