1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.bitrepository.service.workflow;
23
24 import org.bitrepository.service.scheduler.JobEventListener;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import java.util.Date;
29 import java.util.List;
30 import java.util.TimerTask;
31
32
33
34
35
36 public class JobTimerTask extends TimerTask {
37
38 private Logger log = LoggerFactory.getLogger(getClass());
39
40 private Date nextRun;
41
42 private final long interval;
43 private final SchedulableJob job;
44 private List<JobEventListener> jobListeners;
45
46
47
48
49
50
51 public JobTimerTask(long interval, SchedulableJob job, List<JobEventListener> jobListeners) {
52 this.interval = interval;
53 this.job = job;
54 nextRun = new Date();
55 this.jobListeners = jobListeners;
56 }
57
58
59
60
61 public Date getNextRun() {
62 return new Date(nextRun.getTime());
63 }
64
65
66
67
68 public long getIntervalBetweenRuns() {
69 return interval;
70 }
71
72 public String getDescription() {
73 return job.getDescription();
74 }
75
76
77
78
79
80
81 public String runJob() {
82 try {
83 if (job.currentState().equals(SchedulableJob.NOT_RUNNING)) {
84 log.info("Starting job: " + job.getJobID());
85 job.start();
86 if (interval > 0) {
87 nextRun = new Date(System.currentTimeMillis() + interval);
88 }
89 notifyListenersAboutFinishedJob(job);
90 return "Job '" + job.getJobID() + "' finished";
91 } else {
92 log.info("Ignoring start request for " + job.getJobID() + " the job is already running");
93 return "Can not start " + job.getJobID() + ", it is already running in state "
94 + job.currentState();
95 }
96 } catch (Throwable e) {
97 log.error("Fault barrier for '" + job.getJobID() + "' caught unexpected exception.", e);
98 throw new RuntimeException("Failed to run job" + e.getMessage() + ", see server log for details.");
99 }
100 }
101
102 private void notifyListenersAboutFinishedJob(SchedulableJob job) {
103 for (JobEventListener listener:jobListeners) {
104 listener.jobFinished(job);
105 }
106 }
107
108
109
110
111 public String getName() {
112 return job.getJobID().toString();
113 }
114
115 public JobID getWorkflowID() {
116 return job.getJobID();
117 }
118
119 @Override
120 public void run() {
121 try {
122 if( nextRun != null &&
123 getNextRun().getTime() <= System.currentTimeMillis()) {
124 runJob();
125 }
126 } catch (Exception e) {
127 log.error("Failed to run job", e);
128 }
129 }
130 }