创建定时任务生产工厂
import java.text.SimpleDateFormat;
import java.util.Date;
import bingo.modules.bussiness.task.QuartzManager;
/**
*
* <code>{@link QuartzFactory}</code>
*
* TODO : document me
*
* @author shenlu
*/
public class QuartzFactory {
/**
* 个性化菜单定时上架
* @param jobTime 任务调度时间
* @param jobName 任务名称
* {@link}UpShelvesJob 上架任务类
*/
public static void createUpShelvesJob(Date jobDate,String jobName,String id){
String jobTime = convertTime(jobDate);
QuartzManager.addJob(jobName, MenuUpShelvesJob.class, jobTime, id);
}
/**
* 个性化菜单定时下架
* @param jobTime 任务调度时间
* @param jobName 任务名称
* {@link}UpShelvesJob 上架任务类
*/
public static void createDownShelvesJob(Date jobDate,String jobName,String id){
String jobTime = convertTime(jobDate);
QuartzManager.addJob(jobName, MenuDownShelvesJob.class, jobTime, id);
}
/**
* 全网菜单上下架
* @param jobDate 任务调度时间
* @param jobName 任务名称
* {@link}WholeMenuUpOrDownShelvesJob 全网上下架任务类
*/
public static void createWholeUpOrDownShelvesJob(Date jobDate,String jobName,String id){
String jobTime = convertTime(jobDate);
QuartzManager.addJob(jobName, WholeMenuUpOrDownShelvesJob.class, jobTime, id);
}
private static String convertTime(Date jobDate){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(jobDate);
String[] times = time.split(" ");
String[] timesF = times[1].split(":");
String[] timesT = times[0].split("-");
String jobTime = timesF[2]+" "+timesF[1]+" "+timesF[0]+" "+timesT[2]+" "+
timesT[1]+" ? "+timesT[0];
return jobTime;
}
}
id
是我需要传递的参数,根据需要可自行增加。
创建一个定时任务管理类。
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/**
* @Description: 定时任务管理类
*
* @ClassName: QuartzManager
*
* <code>{@link QuartzManager}</code>
*
* TODO : document me
*
* @author shenlu
*/
public class QuartzManager {
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
/**
* @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
*
* @param jobName
* 任务名
* @param cls
* 任务
* @param time
* 时间设置,参考quartz说明文档
*
*/
@SuppressWarnings("unchecked")
public static void addJob(String jobName, Class cls, String time,String id) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
//放入菜单Id
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("id", id);
// 触发器
CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
trigger.setCronExpression(time);// 触发器时间设定
sched.scheduleJob(jobDetail, trigger);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description: 添加一个定时任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
* @param jobClass
* 任务
* @param time
* 时间设置,参考quartz说明文档
*
*/
@SuppressWarnings("unchecked")
public static void addJob(String jobName, String jobGroupName,
String triggerGroupName, Class jobClass,String time,String id) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
//放入菜单Id
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("id", id);
// 触发器
CronTrigger trigger = new CronTrigger(jobName, triggerGroupName);// 触发器名,触发器组
trigger.setCronExpression(time);// 触发器时间设定
sched.scheduleJob(jobDetail, trigger);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description: 修改一个任务的触发时间
*
* @param triggerName
* @param triggerGroupName
* @param time
*
*/
public static void modifyJobTime(String triggerName,
String triggerGroupName, String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
CronTrigger ct = (CronTrigger) trigger;
// 修改时间
ct.setCronExpression(time);
// 重启触发器
sched.resumeTrigger(triggerName, triggerGroupName);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*
*/
public static void removeJob(String jobName) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description: 移除一个任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*
*/
public static void removeJob(String jobName, String jobGroupName,String triggerGroupName) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.pauseTrigger(jobName, triggerGroupName);// 停止触发器
sched.unscheduleJob(jobName, triggerGroupName);// 移除触发器
sched.deleteJob(jobName, jobGroupName);// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description:启动所有定时任务
*
*/
public static void startJobs() {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @Description:关闭所有定时任务
*
*/
public static void shutdownJobs() {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
if (!sched.isShutdown()) {
sched.shutdown();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
动态传参关键在
JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
//放入菜单IdJobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("id", id);
获取到jobDataMap 这个对象,向map里put的参数,将在后续方法中获取。
创建一个你需要定时调度任务的类。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import bingo.alipayApi.alipayService.AlipayMenuOperateService;
/**
* @Description: 个性化菜单上架执行类
*
* @ClassName: QuartzJob
*
* <code>{@link QuartzJob}</code>
*
* TODO : document me
*
* @author shenlu
*/
public class MenuUpShelvesJob implements Job {
protected final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
String id = arg0.getJobDetail().getJobDataMap().getString("id");
AlipayMenuOperateService alipayMenuOperateService = new AlipayMenuOperateService(id);
alipayMenuOperateService.updateTaskAlipayMenu();
alipayMenuOperateService.menuDownShelves();
alipayMenuOperateService.menuUpShelves();
}
}
需要获取的参数从jobDataMap 中获取,在arg0中拿到JobDetail对象,再在JobDetail对象中获取jobDataMap 对象。
String id = arg0.getJobDetail().getJobDataMap().getString("id");
定时任务需要做的操作。写在
public void execute(JobExecutionContext arg0) throws JobExecutionException {
}
方法中即可