1 package org.apache.turbine.services.schedule;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.util.Date;
23 import java.util.concurrent.atomic.AtomicBoolean;
24
25 import org.apache.commons.lang.StringUtils;
26 import org.apache.turbine.modules.ScheduledJobLoader;
27 import org.apache.turbine.util.TurbineException;
28 import org.quartz.Job;
29 import org.quartz.JobBuilder;
30 import org.quartz.JobDetail;
31 import org.quartz.JobExecutionContext;
32 import org.quartz.JobExecutionException;
33 import org.quartz.Trigger;
34 import org.quartz.core.QuartzScheduler;
35
36 /**
37 * This implements a Turbine scheduled job model for the {@link QuartzScheduler}.
38 *
39 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
40 */
41 public class JobEntryQuartz implements JobEntry, Job
42 {
43 private int jobId;
44 private Trigger jobTrigger;
45 private JobDetail jobDetail;
46 private String task;
47 private boolean isnew = true;
48 private AtomicBoolean active = new AtomicBoolean(false);
49
50 /**
51 * the default Quartz schedule group name for Turbine jobs
52 */
53 public static final String DEFAULT_JOB_GROUP_NAME = "TURBINE";
54
55 /**
56 * Default constructor
57 */
58 public JobEntryQuartz()
59 {
60 super();
61 }
62
63 /**
64 * Constructor
65 *
66 * @param jobTrigger Job time table
67 */
68 public JobEntryQuartz(Trigger jobTrigger)
69 {
70 this(jobTrigger, JobBuilder
71 .newJob(JobEntryQuartz.class)
72 .withIdentity(jobTrigger.getJobKey().getName(), DEFAULT_JOB_GROUP_NAME).build());
73 }
74
75 /**
76 * Constructor
77 *
78 * @param jobTrigger Job time table
79 * @param jobDetail job details
80 */
81 public JobEntryQuartz(Trigger jobTrigger, JobDetail jobDetail)
82 {
83 this();
84 setTask(jobTrigger.getJobKey().getName());
85 this.jobTrigger = jobTrigger;
86 this.jobDetail = jobDetail;
87 }
88
89 /**
90 * Return true, if the entry is not yet persisted
91 */
92 @Override
93 public boolean isNew()
94 {
95 boolean _isnew = isnew;
96 isnew = false;
97 return _isnew;
98 }
99
100 /**
101 * Get the value of jobId.
102 *
103 * @return int
104 */
105 @Override
106 public int getJobId()
107 {
108 return jobId;
109 }
110
111 /**
112 * Set the value of jobId.
113 *
114 * @param v new value
115 */
116 @Override
117 public void setJobId(int v)
118 {
119 this.jobId = v;
120 }
121
122 /**
123 * Get the value of task.
124 *
125 * @return String
126 */
127 @Override
128 public String getTask()
129 {
130 return task;
131 }
132
133 /**
134 * Set the value of task.
135 *
136 * @param v new value
137 */
138 @Override
139 public void setTask(String v)
140 {
141 this.task = v;
142 }
143
144 /**
145 * @return the jobTrigger
146 */
147 public Trigger getJobTrigger()
148 {
149 return jobTrigger;
150 }
151
152 /**
153 * @param jobTrigger the jobTrigger to set
154 */
155 public void setJobTrigger(Trigger jobTrigger)
156 {
157 this.jobTrigger = jobTrigger;
158 }
159
160 /**
161 * @return the jobDetail
162 */
163 public JobDetail getJobDetail()
164 {
165 return jobDetail;
166 }
167
168 /**
169 * @see java.lang.Comparable#compareTo(java.lang.Object)
170 */
171 @Override
172 public int compareTo(JobEntry o)
173 {
174 return jobTrigger.compareTo(((JobEntryQuartz)o).getJobTrigger());
175 }
176
177 /**
178 * @see org.apache.turbine.services.schedule.JobEntry#setActive(boolean)
179 */
180 @Override
181 public void setActive(boolean isActive)
182 {
183 this.active.set(isActive);
184 }
185
186 /**
187 * @see org.apache.turbine.services.schedule.JobEntry#isActive()
188 */
189 @Override
190 public boolean isActive()
191 {
192 return active.get();
193 }
194
195 /**
196 * @see org.apache.turbine.services.schedule.JobEntry#getNextRuntime()
197 */
198 @Override
199 public long getNextRuntime()
200 {
201 return getNextRunDate().getTime();
202 }
203
204 /**
205 * @see org.apache.turbine.services.schedule.JobEntry#getNextRunDate()
206 */
207 @Override
208 public Date getNextRunDate()
209 {
210 return jobTrigger.getNextFireTime();
211 }
212
213 /**
214 * @see org.apache.turbine.services.schedule.JobEntry#getNextRunAsString()
215 */
216 @Override
217 public String getNextRunAsString()
218 {
219 return getNextRunDate().toString();
220 }
221
222 /**
223 * @see org.apache.turbine.services.schedule.JobEntry#calcRunTime()
224 */
225 @Override
226 public void calcRunTime() throws TurbineException
227 {
228 // do nothing
229 }
230
231 /**
232 * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
233 */
234 @Override
235 public void execute(JobExecutionContext context) throws JobExecutionException
236 {
237 if (active.compareAndSet(false, true) == false)
238 {
239 return;
240 }
241
242 try
243 {
244 String task = getTask();
245 if (StringUtils.isEmpty(task))
246 {
247 // This happens when the job is configured in the Quartz configuration file
248 task = context.getJobDetail().getKey().getName();
249 }
250 ScheduledJobLoader.getInstance().exec(this, task);
251 }
252 catch (Exception e)
253 {
254 throw new JobExecutionException("Error executing scheduled job #" +
255 getJobId() + ", task: " + getTask(), e);
256 }
257 finally
258 {
259 active.compareAndSet(true, false);
260 }
261 }
262 }