1.首先创建:schedulerFactoryBean
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
2.添加任务:
private static Logger logger = LoggerFactory.getLogger(QuartzManager.class);
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
//添加任务
public void addTask(List<MessageTimetaskConfig> listConfig) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
for (MessageTimetaskConfig timetaskConfig : listConfig) {
//1.看任务是否已经加载
String keyName = timetaskConfig.getId()+timetaskConfig.getTimeTaskName();
TriggerKey triggerKey = TriggerKey.triggerKey(keyName);
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
//如果为空表示任务不存在,添加新任务
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(QuartFactory.class).withIdentity(keyName).build();
jobDetail.getJobDataMap().put("timetaskConfig",timetaskConfig);
//设置表达式
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetaskConfig.getCronexpression());
//创建一个新的Tigger
trigger = TriggerBuilder.newTrigger().withIdentity(keyName).withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail,trigger);
logger.info("添加任务:["+timetaskConfig.getTimeTaskName()+"],任务信息:["+timetaskConfig.getTimeTaskClass()+"."+timetaskConfig.getTimeTaskMethod()+"]");
} else { //任务存在更新任务
// Trigger已存在,那么更新相应的定时设置
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(timetaskConfig.getCronexpression());
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
logger.info("更新任务:["+timetaskConfig.getTimeTaskName()+"],任务信息:["+timetaskConfig.getTimeTaskClass()+"."+timetaskConfig.getTimeTaskMethod()+"]");
}
}
}
3.执行任务
//2.执行任务
public static void invokMethod(MessageTimetaskConfig config) throws NoSuchMethodException, IllegalAccessException, InstantiationException, ClassNotFoundException, InvocationTargetException {
Class clazz = null;
String taskClass = config.getTimeTaskClass();
if (!StringUtils.isEmpty(taskClass)) {
Object clsObj = BeanUtil.getBean(config.getTimeTaskClass());
clazz = clsObj.getClass();
//得到指定的方法
Method method = clazz.getDeclaredMethod(config.getTimeTaskMethod(),config.getGrabNumber().getClass());
if (null == clsObj || null == method) {
logger.info("方法或类名指定错误....");
return;
}
//执行方法
method.invoke(clsObj, config.getGrabNumber());
}
}
4.任务数据初始化
public class InitQuartzData {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private MessageTimetaskConfigDao dao;
@Autowired
private QuartzManager manager;
public void initQuartz() {
//查询全部任务数据
List<MessageTimetaskConfig> list = (List<MessageTimetaskConfig>)dao.findBySwitch();
if (CollectionUtils.isNotEmpty(list)) {
//添加任务
try {
manager.addTask(list);
logger.info("初始化定时任务成功");
} catch (SchedulerException e) {
logger.info("初始化定时任务失败:"+e.getMessage());
// e.printStackTrace();
}
} else {
logger.info("初始化定时任务失败,缺少数据");
}
}
/**
* 刷新任务数据
*/
public void refreshQuartz() {
BeanUtil.refreshBean(InitQuartzData.class,"initQuartzData","initQuartz");
}