13 changed files with 836 additions and 45 deletions
@ -0,0 +1,283 @@
@@ -0,0 +1,283 @@
|
||||
/* |
||||
* Copyright 2002-2011 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.scheduling.quartz; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.util.Date; |
||||
import java.util.Map; |
||||
import java.util.TimeZone; |
||||
|
||||
import org.quartz.CronTrigger; |
||||
import org.quartz.JobDataMap; |
||||
import org.quartz.JobDetail; |
||||
import org.quartz.Scheduler; |
||||
|
||||
import org.springframework.beans.BeanWrapper; |
||||
import org.springframework.beans.BeanWrapperImpl; |
||||
import org.springframework.beans.MutablePropertyValues; |
||||
import org.springframework.beans.factory.BeanNameAware; |
||||
import org.springframework.beans.factory.FactoryBean; |
||||
import org.springframework.beans.factory.InitializingBean; |
||||
import org.springframework.core.Constants; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.ReflectionUtils; |
||||
|
||||
/** |
||||
* A Spring {@link FactoryBean} for creating a Quartz {@link org.quartz.CronTrigger} |
||||
* instance, supporting bean-style usage for trigger configuration. |
||||
* |
||||
* <p><code>CronTrigger(Impl)</code> itself is already a JavaBean but lacks sensible defaults. |
||||
* This class uses the Spring bean name as job name, the Quartz default group ("DEFAULT") |
||||
* as job group, the current time as start time, and indefinite repetition, if not specified. |
||||
* |
||||
* <p>This class will also register the trigger with the job name and group of |
||||
* a given {@link org.quartz.JobDetail}. This allows {@link SchedulerFactoryBean} |
||||
* to automatically register a trigger for the corresponding JobDetail, |
||||
* instead of registering the JobDetail separately. |
||||
* |
||||
* <p><b>NOTE:</b> This FactoryBean works against both Quartz 1.x and Quartz 2.0/2.1, |
||||
* in contrast to the older {@link CronTriggerBean} class. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 3.1 |
||||
* @see #setName |
||||
* @see #setGroup |
||||
* @see #setStartTime |
||||
* @see #setJobName |
||||
* @see #setJobGroup |
||||
* @see #setJobDetail |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setTriggers |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setJobDetails |
||||
* @see org.springframework.scheduling.quartz.SimpleTriggerBean |
||||
*/ |
||||
public class CronTriggerFactoryBean implements FactoryBean<CronTrigger>, BeanNameAware, InitializingBean { |
||||
|
||||
/** Constants for the CronTrigger class */ |
||||
private static final Constants constants = new Constants(CronTrigger.class); |
||||
|
||||
|
||||
private String name; |
||||
|
||||
private String group; |
||||
|
||||
private JobDetail jobDetail; |
||||
|
||||
private JobDataMap jobDataMap = new JobDataMap(); |
||||
|
||||
private Date startTime; |
||||
|
||||
private long startDelay; |
||||
|
||||
private String cronExpression; |
||||
|
||||
private TimeZone timeZone; |
||||
|
||||
private int priority; |
||||
|
||||
private int misfireInstruction; |
||||
|
||||
private String beanName; |
||||
|
||||
private CronTrigger cronTrigger; |
||||
|
||||
|
||||
/** |
||||
* Specify the trigger's name. |
||||
*/ |
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
/** |
||||
* Specify the trigger's group. |
||||
*/ |
||||
public void setGroup(String group) { |
||||
this.group = group; |
||||
} |
||||
|
||||
/** |
||||
* Set the JobDetail that this trigger should be associated with. |
||||
*/ |
||||
public void setJobDetail(JobDetail jobDetail) { |
||||
this.jobDetail = jobDetail; |
||||
} |
||||
|
||||
/** |
||||
* Set the trigger's JobDataMap. |
||||
* @see #setJobDataAsMap |
||||
*/ |
||||
public void setJobDataMap(JobDataMap jobDataMap) { |
||||
this.jobDataMap = jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Return the trigger's JobDataMap. |
||||
*/ |
||||
public JobDataMap getJobDataMap() { |
||||
return this.jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Register objects in the JobDataMap via a given Map. |
||||
* <p>These objects will be available to this Trigger only, |
||||
* in contrast to objects in the JobDetail's data map. |
||||
* @param jobDataAsMap Map with String keys and any objects as values |
||||
* (for example Spring-managed beans) |
||||
* @see org.springframework.scheduling.quartz.JobDetailBean#setJobDataAsMap |
||||
*/ |
||||
public void setJobDataAsMap(Map<String, ?> jobDataAsMap) { |
||||
this.jobDataMap.putAll(jobDataAsMap); |
||||
} |
||||
|
||||
/** |
||||
* Set the start delay in milliseconds. |
||||
* <p>The start delay is added to the current system time (when the bean starts) |
||||
* to control the start time of the trigger. |
||||
* @param startDelay the start delay, in milliseconds |
||||
*/ |
||||
public void setStartDelay(long startDelay) { |
||||
Assert.state(startDelay >= 0, "Start delay cannot be negative."); |
||||
this.startDelay = startDelay; |
||||
} |
||||
|
||||
/** |
||||
* Specify the cron expression for this trigger. |
||||
*/ |
||||
public void setCronExpression(String cronExpression) { |
||||
this.cronExpression = cronExpression; |
||||
} |
||||
|
||||
/** |
||||
* Specify the time zone for this trigger's cron expression. |
||||
*/ |
||||
public void setTimeZone(TimeZone timeZone) { |
||||
this.timeZone = timeZone; |
||||
} |
||||
|
||||
/** |
||||
* Specify the priority of this trigger. |
||||
*/ |
||||
public void setPriority(int priority) { |
||||
this.priority = priority; |
||||
} |
||||
|
||||
/** |
||||
* Specify a misfire instruction for this trigger. |
||||
*/ |
||||
public void setMisfireInstruction(int misfireInstruction) { |
||||
this.misfireInstruction = misfireInstruction; |
||||
} |
||||
|
||||
/** |
||||
* Set the misfire instruction via the name of the corresponding |
||||
* constant in the {@link org.quartz.CronTrigger} class. |
||||
* Default is <code>MISFIRE_INSTRUCTION_SMART_POLICY</code>. |
||||
* @see org.quartz.CronTrigger#MISFIRE_INSTRUCTION_FIRE_ONCE_NOW |
||||
* @see org.quartz.CronTrigger#MISFIRE_INSTRUCTION_DO_NOTHING |
||||
* @see org.quartz.Trigger#MISFIRE_INSTRUCTION_SMART_POLICY |
||||
*/ |
||||
public void setMisfireInstructionName(String constantName) { |
||||
this.misfireInstruction = constants.asNumber(constantName).intValue(); |
||||
} |
||||
|
||||
public void setBeanName(String beanName) { |
||||
this.beanName = beanName; |
||||
} |
||||
|
||||
|
||||
public void afterPropertiesSet() { |
||||
if (this.name == null) { |
||||
this.name = this.beanName; |
||||
} |
||||
if (this.group == null) { |
||||
this.group = Scheduler.DEFAULT_GROUP; |
||||
} |
||||
if (this.jobDetail != null) { |
||||
this.jobDataMap.put(JobDetailAwareTrigger.JOB_DETAIL_KEY, this.jobDetail); |
||||
} |
||||
if (this.startDelay > 0) { |
||||
this.startTime = new Date(System.currentTimeMillis() + this.startDelay); |
||||
} |
||||
else if (this.startTime == null) { |
||||
this.startTime = new Date(); |
||||
} |
||||
if (this.timeZone == null) { |
||||
this.timeZone = TimeZone.getDefault(); |
||||
} |
||||
|
||||
/* |
||||
CronTriggerImpl cti = new CronTriggerImpl(); |
||||
cti.setName(this.name); |
||||
cti.setGroup(this.group); |
||||
cti.setJobKey(this.jobDetail.getKey()); |
||||
cti.setJobDataMap(this.jobDataMap); |
||||
cti.setStartTime(this.startTime); |
||||
cti.setCronExpression(this.cronExpression); |
||||
cti.setTimeZone(this.timeZone); |
||||
cti.setPriority(this.priority); |
||||
cti.setMisfireInstruction(this.misfireInstruction); |
||||
this.cronTrigger = cti; |
||||
*/ |
||||
|
||||
Class cronTriggerClass; |
||||
Method jobKeyMethod; |
||||
try { |
||||
cronTriggerClass = getClass().getClassLoader().loadClass("org.quartz.impl.triggers.CronTriggerImpl"); |
||||
jobKeyMethod = JobDetail.class.getMethod("getKey"); |
||||
} |
||||
catch (ClassNotFoundException ex) { |
||||
cronTriggerClass = CronTrigger.class; |
||||
jobKeyMethod = null; |
||||
} |
||||
catch (NoSuchMethodException ex) { |
||||
throw new IllegalStateException("Incompatible Quartz version"); |
||||
} |
||||
BeanWrapper bw = new BeanWrapperImpl(cronTriggerClass); |
||||
MutablePropertyValues pvs = new MutablePropertyValues(); |
||||
pvs.add("name", this.name); |
||||
pvs.add("group", this.group); |
||||
if (jobKeyMethod != null) { |
||||
pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); |
||||
} |
||||
else { |
||||
pvs.add("jobName", this.jobDetail.getName()); |
||||
pvs.add("jobGroup", this.jobDetail.getGroup()); |
||||
} |
||||
pvs.add("jobDataMap", this.jobDataMap); |
||||
pvs.add("startTime", this.startTime); |
||||
pvs.add("cronExpression", this.cronExpression); |
||||
pvs.add("timeZone", this.timeZone); |
||||
pvs.add("priority", this.priority); |
||||
pvs.add("misfireInstruction", this.misfireInstruction); |
||||
bw.setPropertyValues(pvs); |
||||
this.cronTrigger = (CronTrigger) bw.getWrappedInstance(); |
||||
} |
||||
|
||||
|
||||
public CronTrigger getObject() { |
||||
return this.cronTrigger; |
||||
} |
||||
|
||||
public Class<?> getObjectType() { |
||||
return CronTrigger.class; |
||||
} |
||||
|
||||
public boolean isSingleton() { |
||||
return true; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,208 @@
@@ -0,0 +1,208 @@
|
||||
/* |
||||
* Copyright 2002-2011 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.scheduling.quartz; |
||||
|
||||
import java.util.Map; |
||||
|
||||
import org.quartz.JobDataMap; |
||||
import org.quartz.JobDetail; |
||||
import org.quartz.Scheduler; |
||||
|
||||
import org.springframework.beans.BeanWrapper; |
||||
import org.springframework.beans.BeanWrapperImpl; |
||||
import org.springframework.beans.MutablePropertyValues; |
||||
import org.springframework.beans.factory.BeanNameAware; |
||||
import org.springframework.beans.factory.FactoryBean; |
||||
import org.springframework.beans.factory.InitializingBean; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.ApplicationContextAware; |
||||
|
||||
/** |
||||
* A Spring {@link FactoryBean} for creating a Quartz {@link org.quartz.JobDetail} |
||||
* instance, supporting bean-style usage for JobDetail configuration. |
||||
* |
||||
* <p><code>JobDetail(Impl)</code> itself is already a JavaBean but lacks |
||||
* sensible defaults. This class uses the Spring bean name as job name, |
||||
* and the Quartz default group ("DEFAULT") as job group if not specified. |
||||
* |
||||
* <p><b>NOTE:</b> This FactoryBean works against both Quartz 1.x and Quartz 2.0/2.1, |
||||
* in contrast to the older {@link JobDetailBean} class. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 3.1 |
||||
* @see #setName |
||||
* @see #setGroup |
||||
* @see org.springframework.beans.factory.BeanNameAware |
||||
* @see org.quartz.Scheduler#DEFAULT_GROUP |
||||
*/ |
||||
public class JobDetailFactoryBean |
||||
implements FactoryBean<JobDetail>, BeanNameAware, ApplicationContextAware, InitializingBean { |
||||
|
||||
private String name; |
||||
|
||||
private String group; |
||||
|
||||
private Class jobClass; |
||||
|
||||
private JobDataMap jobDataMap = new JobDataMap(); |
||||
|
||||
private String beanName; |
||||
|
||||
private ApplicationContext applicationContext; |
||||
|
||||
private String applicationContextJobDataKey; |
||||
|
||||
private JobDetail jobDetail; |
||||
|
||||
|
||||
/** |
||||
* Specify the job's name. |
||||
*/ |
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
/** |
||||
* Specify the job's group. |
||||
*/ |
||||
public void setGroup(String group) { |
||||
this.group = group; |
||||
} |
||||
|
||||
/** |
||||
* Specify the job's implementation class. |
||||
*/ |
||||
public void setJobClass(Class jobClass) { |
||||
this.jobClass = jobClass; |
||||
} |
||||
|
||||
/** |
||||
* Set the job's JobDataMap. |
||||
* @see #setJobDataAsMap |
||||
*/ |
||||
public void setJobDataMap(JobDataMap jobDataMap) { |
||||
this.jobDataMap = jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Return the job's JobDataMap. |
||||
*/ |
||||
public JobDataMap getJobDataMap() { |
||||
return this.jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Register objects in the JobDataMap via a given Map. |
||||
* <p>These objects will be available to this Job only, |
||||
* in contrast to objects in the SchedulerContext. |
||||
* <p>Note: When using persistent Jobs whose JobDetail will be kept in the |
||||
* database, do not put Spring-managed beans or an ApplicationContext |
||||
* reference into the JobDataMap but rather into the SchedulerContext. |
||||
* @param jobDataAsMap Map with String keys and any objects as values |
||||
* (for example Spring-managed beans) |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setSchedulerContextAsMap |
||||
*/ |
||||
public void setJobDataAsMap(Map<String, ?> jobDataAsMap) { |
||||
getJobDataMap().putAll(jobDataAsMap); |
||||
} |
||||
|
||||
public void setBeanName(String beanName) { |
||||
this.beanName = beanName; |
||||
} |
||||
|
||||
public void setApplicationContext(ApplicationContext applicationContext) { |
||||
this.applicationContext = applicationContext; |
||||
} |
||||
|
||||
/** |
||||
* Set the key of an ApplicationContext reference to expose in the JobDataMap, |
||||
* for example "applicationContext". Default is none. |
||||
* Only applicable when running in a Spring ApplicationContext. |
||||
* <p>In case of a QuartzJobBean, the reference will be applied to the Job |
||||
* instance as bean property. An "applicationContext" attribute will correspond |
||||
* to a "setApplicationContext" method in that scenario. |
||||
* <p>Note that BeanFactory callback interfaces like ApplicationContextAware |
||||
* are not automatically applied to Quartz Job instances, because Quartz |
||||
* itself is responsible for the lifecycle of its Jobs. |
||||
* <p><b>Note: When using persistent job stores where JobDetail contents will |
||||
* be kept in the database, do not put an ApplicationContext reference into |
||||
* the JobDataMap but rather into the SchedulerContext.</b> |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setApplicationContextSchedulerContextKey |
||||
* @see org.springframework.context.ApplicationContext |
||||
*/ |
||||
public void setApplicationContextJobDataKey(String applicationContextJobDataKey) { |
||||
this.applicationContextJobDataKey = applicationContextJobDataKey; |
||||
} |
||||
|
||||
|
||||
@SuppressWarnings("unchecked") |
||||
public void afterPropertiesSet() { |
||||
if (this.name == null) { |
||||
this.name = this.beanName; |
||||
} |
||||
if (this.group == null) { |
||||
this.group = Scheduler.DEFAULT_GROUP; |
||||
} |
||||
if (this.applicationContextJobDataKey != null) { |
||||
if (this.applicationContext == null) { |
||||
throw new IllegalStateException( |
||||
"JobDetailBean needs to be set up in an ApplicationContext " + |
||||
"to be able to handle an 'applicationContextJobDataKey'"); |
||||
} |
||||
getJobDataMap().put(this.applicationContextJobDataKey, this.applicationContext); |
||||
} |
||||
|
||||
/* |
||||
JobDetailImpl jdi = new JobDetailImpl(); |
||||
jdi.setName(this.name); |
||||
jdi.setGroup(this.group); |
||||
jdi.setJobClass(this.jobClass); |
||||
jdi.setJobDataMap(this.jobDataMap); |
||||
this.jobDetail = jdi; |
||||
*/ |
||||
|
||||
Class jobDetailClass; |
||||
try { |
||||
jobDetailClass = getClass().getClassLoader().loadClass("org.quartz.impl.JobDetailImpl"); |
||||
} |
||||
catch (ClassNotFoundException ex) { |
||||
jobDetailClass = JobDetail.class; |
||||
} |
||||
BeanWrapper bw = new BeanWrapperImpl(jobDetailClass); |
||||
MutablePropertyValues pvs = new MutablePropertyValues(); |
||||
pvs.add("name", this.name); |
||||
pvs.add("group", this.group); |
||||
pvs.add("jobClass", this.jobClass); |
||||
pvs.add("jobDataMap", this.jobDataMap); |
||||
bw.setPropertyValues(pvs); |
||||
this.jobDetail = (JobDetail) bw.getWrappedInstance(); |
||||
} |
||||
|
||||
|
||||
public JobDetail getObject() { |
||||
return this.jobDetail; |
||||
} |
||||
|
||||
public Class<?> getObjectType() { |
||||
return JobDetail.class; |
||||
} |
||||
|
||||
public boolean isSingleton() { |
||||
return true; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,272 @@
@@ -0,0 +1,272 @@
|
||||
/* |
||||
* Copyright 2002-2011 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.scheduling.quartz; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.text.ParseException; |
||||
import java.util.Date; |
||||
import java.util.Map; |
||||
|
||||
import org.quartz.JobDataMap; |
||||
import org.quartz.JobDetail; |
||||
import org.quartz.Scheduler; |
||||
import org.quartz.SimpleTrigger; |
||||
|
||||
import org.springframework.beans.BeanWrapper; |
||||
import org.springframework.beans.BeanWrapperImpl; |
||||
import org.springframework.beans.MutablePropertyValues; |
||||
import org.springframework.beans.factory.BeanNameAware; |
||||
import org.springframework.beans.factory.FactoryBean; |
||||
import org.springframework.beans.factory.InitializingBean; |
||||
import org.springframework.core.Constants; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.ReflectionUtils; |
||||
|
||||
/** |
||||
* A Spring {@link FactoryBean} for creating a Quartz {@link org.quartz.SimpleTrigger} |
||||
* instance, supporting bean-style usage for trigger configuration. |
||||
* |
||||
* <p><code>SimpleTrigger(Impl)</code> itself is already a JavaBean but lacks sensible defaults. |
||||
* This class uses the Spring bean name as job name, the Quartz default group ("DEFAULT") |
||||
* as job group, the current time as start time, and indefinite repetition, if not specified. |
||||
* |
||||
* <p>This class will also register the trigger with the job name and group of |
||||
* a given {@link org.quartz.JobDetail}. This allows {@link SchedulerFactoryBean} |
||||
* to automatically register a trigger for the corresponding JobDetail, |
||||
* instead of registering the JobDetail separately. |
||||
* |
||||
* <p><b>NOTE:</b> This FactoryBean works against both Quartz 1.x and Quartz 2.0/2.1, |
||||
* in contrast to the older {@link SimpleTriggerBean} class. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 3.1 |
||||
* @see #setName |
||||
* @see #setGroup |
||||
* @see #setStartTime |
||||
* @see #setJobName |
||||
* @see #setJobGroup |
||||
* @see #setJobDetail |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setTriggers |
||||
* @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setJobDetails |
||||
* @see org.springframework.scheduling.quartz.CronTriggerBean |
||||
*/ |
||||
public class SimpleTriggerFactoryBean implements FactoryBean<SimpleTrigger>, BeanNameAware, InitializingBean { |
||||
|
||||
/** Constants for the SimpleTrigger class */ |
||||
private static final Constants constants = new Constants(SimpleTrigger.class); |
||||
|
||||
|
||||
private String name; |
||||
|
||||
private String group; |
||||
|
||||
private JobDetail jobDetail; |
||||
|
||||
private JobDataMap jobDataMap = new JobDataMap(); |
||||
|
||||
private Date startTime; |
||||
|
||||
private long startDelay; |
||||
|
||||
private long repeatInterval; |
||||
|
||||
private int priority; |
||||
|
||||
private int misfireInstruction; |
||||
|
||||
private String beanName; |
||||
|
||||
private SimpleTrigger simpleTrigger; |
||||
|
||||
|
||||
/** |
||||
* Specify the trigger's name. |
||||
*/ |
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
/** |
||||
* Specify the trigger's group. |
||||
*/ |
||||
public void setGroup(String group) { |
||||
this.group = group; |
||||
} |
||||
|
||||
/** |
||||
* Set the JobDetail that this trigger should be associated with. |
||||
*/ |
||||
public void setJobDetail(JobDetail jobDetail) { |
||||
this.jobDetail = jobDetail; |
||||
} |
||||
|
||||
/** |
||||
* Set the trigger's JobDataMap. |
||||
* @see #setJobDataAsMap |
||||
*/ |
||||
public void setJobDataMap(JobDataMap jobDataMap) { |
||||
this.jobDataMap = jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Return the trigger's JobDataMap. |
||||
*/ |
||||
public JobDataMap getJobDataMap() { |
||||
return this.jobDataMap; |
||||
} |
||||
|
||||
/** |
||||
* Register objects in the JobDataMap via a given Map. |
||||
* <p>These objects will be available to this Trigger only, |
||||
* in contrast to objects in the JobDetail's data map. |
||||
* @param jobDataAsMap Map with String keys and any objects as values |
||||
* (for example Spring-managed beans) |
||||
* @see org.springframework.scheduling.quartz.JobDetailBean#setJobDataAsMap |
||||
*/ |
||||
public void setJobDataAsMap(Map<String, ?> jobDataAsMap) { |
||||
this.jobDataMap.putAll(jobDataAsMap); |
||||
} |
||||
|
||||
/** |
||||
* Set the start delay in milliseconds. |
||||
* <p>The start delay is added to the current system time (when the bean starts) |
||||
* to control the start time of the trigger. |
||||
* @param startDelay the start delay, in milliseconds |
||||
*/ |
||||
public void setStartDelay(long startDelay) { |
||||
Assert.state(startDelay >= 0, "Start delay cannot be negative."); |
||||
this.startDelay = startDelay; |
||||
} |
||||
|
||||
/** |
||||
* Specify the interval between execution times of this trigger. |
||||
*/ |
||||
public void setRepeatInterval(long repeatInterval) { |
||||
this.repeatInterval = repeatInterval; |
||||
} |
||||
|
||||
/** |
||||
* Specify the priority of this trigger. |
||||
*/ |
||||
public void setPriority(int priority) { |
||||
this.priority = priority; |
||||
} |
||||
|
||||
/** |
||||
* Specify a misfire instruction for this trigger. |
||||
*/ |
||||
public void setMisfireInstruction(int misfireInstruction) { |
||||
this.misfireInstruction = misfireInstruction; |
||||
} |
||||
|
||||
/** |
||||
* Set the misfire instruction via the name of the corresponding |
||||
* constant in the {@link org.quartz.SimpleTrigger} class. |
||||
* Default is <code>MISFIRE_INSTRUCTION_SMART_POLICY</code>. |
||||
* @see org.quartz.SimpleTrigger#MISFIRE_INSTRUCTION_FIRE_NOW |
||||
* @see org.quartz.SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT |
||||
* @see org.quartz.SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT |
||||
* @see org.quartz.SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT |
||||
* @see org.quartz.SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT |
||||
* @see org.quartz.Trigger#MISFIRE_INSTRUCTION_SMART_POLICY |
||||
*/ |
||||
public void setMisfireInstructionName(String constantName) { |
||||
this.misfireInstruction = constants.asNumber(constantName).intValue(); |
||||
} |
||||
|
||||
public void setBeanName(String beanName) { |
||||
this.beanName = beanName; |
||||
} |
||||
|
||||
|
||||
public void afterPropertiesSet() throws ParseException { |
||||
if (this.name == null) { |
||||
this.name = this.beanName; |
||||
} |
||||
if (this.group == null) { |
||||
this.group = Scheduler.DEFAULT_GROUP; |
||||
} |
||||
if (this.jobDetail != null) { |
||||
this.jobDataMap.put(JobDetailAwareTrigger.JOB_DETAIL_KEY, this.jobDetail); |
||||
} |
||||
if (this.startDelay > 0) { |
||||
this.startTime = new Date(System.currentTimeMillis() + this.startDelay); |
||||
} |
||||
else if (this.startTime == null) { |
||||
this.startTime = new Date(); |
||||
} |
||||
|
||||
/* |
||||
SimpleTriggerImpl sti = new SimpleTriggerImpl(); |
||||
sti.setName(this.name); |
||||
sti.setGroup(this.group); |
||||
sti.setJobKey(this.jobDetail.getKey()); |
||||
sti.setJobDataMap(this.jobDataMap); |
||||
sti.setStartTime(this.startTime); |
||||
sti.setRepeatInterval(this.repeatInterval); |
||||
sti.setPriority(this.priority); |
||||
sti.setMisfireInstruction(this.misfireInstruction); |
||||
this.simpleTrigger = sti; |
||||
*/ |
||||
|
||||
Class simpleTriggerClass; |
||||
Method jobKeyMethod; |
||||
try { |
||||
simpleTriggerClass = getClass().getClassLoader().loadClass("org.quartz.impl.triggers.SimpleTriggerImpl"); |
||||
jobKeyMethod = JobDetail.class.getMethod("getKey"); |
||||
} |
||||
catch (ClassNotFoundException ex) { |
||||
simpleTriggerClass = SimpleTrigger.class; |
||||
jobKeyMethod = null; |
||||
} |
||||
catch (NoSuchMethodException ex) { |
||||
throw new IllegalStateException("Incompatible Quartz version"); |
||||
} |
||||
BeanWrapper bw = new BeanWrapperImpl(simpleTriggerClass); |
||||
MutablePropertyValues pvs = new MutablePropertyValues(); |
||||
pvs.add("name", this.name); |
||||
pvs.add("group", this.group); |
||||
if (jobKeyMethod != null) { |
||||
pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); |
||||
} |
||||
else { |
||||
pvs.add("jobName", this.jobDetail.getName()); |
||||
pvs.add("jobGroup", this.jobDetail.getGroup()); |
||||
} |
||||
pvs.add("jobDataMap", this.jobDataMap); |
||||
pvs.add("startTime", this.startTime); |
||||
pvs.add("repeatInterval", this.repeatInterval); |
||||
pvs.add("repeatCount", -1); |
||||
pvs.add("priority", this.priority); |
||||
pvs.add("misfireInstruction", this.misfireInstruction); |
||||
bw.setPropertyValues(pvs); |
||||
this.simpleTrigger = (SimpleTrigger) bw.getWrappedInstance(); |
||||
} |
||||
|
||||
|
||||
public SimpleTrigger getObject() { |
||||
return this.simpleTrigger; |
||||
} |
||||
|
||||
public Class<?> getObjectType() { |
||||
return SimpleTrigger.class; |
||||
} |
||||
|
||||
public boolean isSingleton() { |
||||
return true; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue