spring-quartz.xml
<context:component-scan base-package="com.test.job" />
<!-- 可持久化的quartz -->
<bean id="scheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="autoStartup" value="true" /> <!--自动启动 -->
<property name="startupDelay" value="20" /> <!--延时启动 -->
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="WEB-INF/conf/quartz.properties"/>
</bean>
quartz.properties
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000
SystemScheduler.java
@Component
public class SystemScheduler{
/** @author xuegang on 2016年3月22日
* @TODO
*/
@Autowired
private Scheduler scheduler;
/**
* @author xuegang on 2016年3月22日
* @TODO add job
*/
public boolean addJob(JobTaskInfo jobTaskInfo) throws SchedulerException{
TriggerKey triggerKey = TriggerKey.triggerKey(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP);
JobKey jobKey = new JobKey(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP);
if(checkExists(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP)){
return false;
}
//不触发立即执行,等待下次Cron触发频率达到时执行
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobTaskInfo.getJobCron())
.withMisfireHandlingInstructionIgnoreMisfires();
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder)
.build();
JobDetail jobDetail = JobBuilder.newJob(jobTaskInfo.getJobClass()).withIdentity(jobKey).build();
//JobDataMap jobDataMap = jobDetail.getJobDataMap();
// jobDataMap.putAll(null);
scheduler.scheduleJob(jobDetail, cronTrigger);
return true;
}
/**
* @author xuegang on 2016年3月22日
* @TODO 检查job是否存在
*/
private boolean checkExists(String jobName, String jobGroup) throws SchedulerException{
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
return scheduler.checkExists(triggerKey);
}
/**
* @author xuegang on 2016年3月22日
* @TODO 重新执行
*/
public boolean rescheduleJob(JobTaskInfo jobTaskInfo) throws SchedulerException {
// TriggerKey valid if_exists
if (!checkExists(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP)) {
return false;
}
// TriggerKey : name + group
TriggerKey triggerKey = TriggerKey.triggerKey(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP);
JobKey jobKey = new JobKey(jobTaskInfo.getJobName(), Scheduler.DEFAULT_GROUP);
// CronTrigger : TriggerKey + cronExpression
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobTaskInfo.getJobCron()).withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
//scheduler.rescheduleJob(triggerKey, cronTrigger);
// JobDetail-JobDataMap fresh
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.clear();
// Trigger fresh
HashSet<Trigger> triggerSet = new HashSet<Trigger>();
triggerSet.add(cronTrigger);
scheduler.scheduleJob(jobDetail, triggerSet, true);
return true;
}
/**
* @author xuegang on 2016年3月22日
* @TODO 执行job(一次)
*/
public boolean triggerJob(String jobName) throws SchedulerException {
// TriggerKey : name + group
JobKey jobKey = new JobKey(jobName, Scheduler.DEFAULT_GROUP);
boolean result = false;
if (checkExists(jobName, Scheduler.DEFAULT_GROUP)) {
scheduler.triggerJob(jobKey);
result = true;
}
return result;
}
/**
* @author xuegang on 2016年3月22日
* @TODO 停止作业job
*/
public boolean pauseJob(String jobName) throws SchedulerException {
// TriggerKey : name + group
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Scheduler.DEFAULT_GROUP);
boolean result = false;
if (checkExists(jobName, Scheduler.DEFAULT_GROUP)) {
scheduler.pauseTrigger(triggerKey);
result = true;
}
return result;
}
/**
* @author xuegang on 2016年3月22日
* @TODO 恢复job
*/
public boolean resumeJob(String jobName) throws SchedulerException {
// TriggerKey : name + group
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Scheduler.DEFAULT_GROUP);
boolean result = false;
if (checkExists(jobName, Scheduler.DEFAULT_GROUP)) {
scheduler.resumeTrigger(triggerKey);
result = true;
}
return result;
}
/**
* @author xuegang on 2016年3月22日
* @TODO 删除job
*/
public boolean removeJob(String jobName) throws SchedulerException {
// TriggerKey : name + group
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Scheduler.DEFAULT_GROUP);
boolean result = false;
if (checkExists(jobName, Scheduler.DEFAULT_GROUP)) {
result = scheduler.unscheduleJob(triggerKey);
}
return result;
}
}
定义JobTaskInfo.java,SystemJob implements Job