pom依赖
org.quartz-scheduler
quartz
2.2.1
Quartz管理工具类
package cn.com.baidu.util;
import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.quartz.*;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;
public class QuartzManager {
//创建一个SchedulerFactory工厂实例
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
public static void addJob(String groupId, String taskId, String time, Map params) {
try {
Scheduler scheduler = gSchedulerFactory.getScheduler();
JobDetail jobDetail= JobBuilder.newJob(SyncDataTask.class).withIdentity(taskId, groupId).build();
jobDetail.getJobDataMap().put("params", params);
CronTrigger trigger = (CronTrigger) TriggerBuilder
.newTrigger()
.withIdentity(taskId, groupId)
.withSchedule(CronScheduleBuilder.cronSchedule(time))
.build();
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isShutdown()) {
scheduler.start();// 启动
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("创建失败");
}
}
public static void modifyJob(String groupId, String taskId, String time, Map params) {
try {
Scheduler scheduler = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronexpression();
if (!oldTime.equalsIgnoreCase(time)) {
JobKey jobKey = JobKey.jobKey(taskId, groupId);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
Class extends Job> objJobClass = jobDetail.getJobClass();
removeJob(groupId, taskId);
addJob(groupId, taskId, time, params);
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("修改失败");
}
}
public static void removeJob(String groupId, String taskId) {
try {
Scheduler scheduler = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
JobKey jobKey = JobKey.jobKey(taskId, groupId);
scheduler.pauseTrigger(triggerKey); // 停止触发器
scheduler.unscheduleJob(triggerKey);// 移除触发器
scheduler.deleteJob(jobKey); // 删除任务
} catch (Exception e) {
e.printStackTrace();
throw new Exception("移除失败");
}
}
public static Boolean existsJob(String groupId, String taskId) {
try {
Scheduler scheduler = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
if (trigger == null) {
return false;
}
//获取trigger拥有的Job
JobKey jobKey = trigger.getJobKey();
JobDetailImpl jobDetail = (JobDetailImpl) scheduler.getJobDetail(jobKey);
if(jobDetail.getName().equals(taskId)) {
return true;
}
}catch(Exception e) {
e.printStackTrace();
throw new Exception("查询失败");
}
return false;
}
public static List
Spring启动的时候通过数据库查询启动定时任务
package cn.com.baidu.util;
import cn.com.baidu.service.datasync.IDatasyncService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringUtil.applicationContext+"========");
IDatasyncService iDatasyncService = getBean(IDatasyncService.class);
iDatasyncService.initQuartzTask();
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static T getBean(Class clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static T getBean(String name,Class clazz){
return getApplicationContext().getBean(name, clazz);
}
}
Job定时实现类
package cn.com.baidu.util;
import org.quartz.*;
import java.util.Map;
@DisallowConcurrentExecution // 防止定时任务并行执行
public class SyncDataTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 取出任务参数
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
Map params = (Map) jobDataMap.get("params");
}
}