View Javadoc

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 }