创建定时任务生产工厂
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 {
}
方法中即可