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 }