maven依赖
org.quartz-scheduler
quartz
2.2.2
spring整合配置
jobFactory
package hotkidclub.service.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
触发器
package hotkidclub.service.quartz;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
/**
* 触发器配置:动态配置定时任务
* @author guohongen
*/
@Component
public class QuartzManager {
private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
// private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
@Autowired
private SchedulerFactoryBean schedulerFactory;
/**
* 添加定时触发任务
* @param jobName 任务id:必须是惟一(对于同个模块的定时调用,例:定时推送任务的key)
* @param date 触发时间:定时任务的定时推送时间
* @param jobClass
* @param objects 触发后需传递到触发执行函数的参数: 例:本后台系统的定时任务bean数据
*/
public void addJob(String jobName, Date date, Class extends Job> jobClass, Object... objects) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
String cron = sdf.format(date);
Scheduler scheduler = schedulerFactory.getScheduler();
if (scheduler.getJobDetail(JobKey.jobKey(jobName)) != null) {
return;
}
// 任务名,任务组,任务执行类
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
jobDetail.getJobDataMap().put("" + i, objects[i]);
}
}
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(jobName, TRIGGER_GROUP_NAME);
triggerBuilder.startNow();
// 触发器时间设定
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
// 建立Trigger对象
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
// 调度容器设置JobDetail和Trigger
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (!scheduler.isShutdown()) {
scheduler.start();
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 修改一个定时任务
*
*/
public void modifyJobTime(String triggerName, Date date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
String cron = sdf.format(date);
Scheduler scheduler = schedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)) {
// 触发器
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(triggerName, TRIGGER_GROUP_NAME);
triggerBuilder.startNow();
// 触发器时间设定
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
// 建立Trigger对象
trigger = (CronTrigger) triggerBuilder.build();
// 方式一 :修改一个任务的触发时间
scheduler.rescheduleJob(triggerKey, trigger);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 删除一个定时任务
*
*/
public void removeJob(String triggerName) {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);
// 中止触发器
scheduler.pauseTrigger(triggerKey);
// 移除触发器
scheduler.unscheduleJob(triggerKey);
// 删除任务
scheduler.deleteJob(JobKey.jobKey(triggerName, JOB_GROUP_NAME));
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
任务执行器
package hotkidclub.service.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/**
* 执行器服务: 消息定时推送执行器
*
* 不一样的业务模块需单独匹配
*
*/
@Component
public class DmeoJob implements Job {
// TODO 消息推送服务
// @Autowired
// NotificationService notificationService;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// mapService.mapSettlement();
// TODO 取出触发器中传入的参数(objects),使用匹配的类型接收(例Object)
// Object o = arg0.getJobDetail().getJobDataMap().get("0").toString();
// TODO 执行具体业务 例: 消息推送函数(sendWeixinMsg),传入取出的参数(具体参数参考消息推送函数的参数列表声明)
// notificationService.sendWeixinMsg(taste);
}
}