要求
根据任务清单执行不定数量,不定频率的定时任务。并且需要动态添加,删除,修改任务。
代码
public class JobExample { public static void main(String[] args) throws Exception { // Job的配置信息,可以从数据库或配置文件中获取 List<JobParameter> list = new ArrayList<JobParameter>(); String jobGroup = "JobGroup1"; for (int i = 1; i < 4; i++) { JobParameter param = new JobParameter(); param.setJobName("Job" + i); param.setJobGroup(jobGroup); param.setCronExpression("0/5 * * * * ?"); param.setDescription("Execute job " + i + " every 5 seconds ..."); list.add(param); } AbstractApplicationContext context = new ClassPathXmlApplicationContext("dynamic-jobs.xml"); try { Scheduler scheduler = (Scheduler) context.getBean("scheduler"); // ### 创建并启动job ### for (JobParameter param : list) { // 构建job信息 JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity(param.getJobName(), param.getJobGroup()).build(); // 表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(param.getCronExpression()); // 按cronExpression表达式构建trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(param.getJobName(), param.getJobGroup()) .withSchedule(scheduleBuilder).build(); // 放入参数,运行时的方法可以获取 jobDetail.getJobDataMap().put("jobParam", param); scheduler.scheduleJob(jobDetail, trigger); } // ### 移除job3 ### Thread.sleep(5000); System.out.println("### 移除job3 ###"); scheduler.deleteJob(JobKey.jobKey("Job3", jobGroup)); // ### 暂停job1和job2 ### Thread.sleep(5000); System.out.println("### 暂停job1和job2 ###"); scheduler.pauseJob(JobKey.jobKey("Job1", jobGroup)); scheduler.pauseJob(JobKey.jobKey("Job2", jobGroup)); // ### 再次启动job1 ### Thread.sleep(5000); System.out.println("### 再次启动job1 ###"); scheduler.resumeJob(JobKey.jobKey("Job1", jobGroup)); // ### 修改job1的cron ### Thread.sleep(5000); System.out.println("### 修改job1的cron为每3秒执行一次 ###"); TriggerKey triggerKey = TriggerKey.triggerKey("Job1", jobGroup); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ?"); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); // 获取job参数并修改描述 JobParameter jobParam = (JobParameter) scheduler.getJobDetail(JobKey.jobKey("Job1", jobGroup)) .getJobDataMap().get(JobParameter.JOB_PARAM); jobParam.setCronExpression("0/3 * * * * ?"); jobParam.setDescription("Execute job 1 every 3 seconds ..."); scheduler.rescheduleJob(triggerKey, trigger); // 打印内存中的所有 Job Thread.sleep(5000); System.out.println("### 打印内存中的所有 Job的状态 ###"); Set<TriggerKey> triggerKeys = scheduler.getTriggerKeys(GroupMatcher.anyTriggerGroup()); for (TriggerKey tKey : triggerKeys) { CronTrigger t = (CronTrigger) scheduler.getTrigger(tKey); System.out.println("Trigger details: " + t.getJobKey().getName() + ", " + t.getJobKey().getGroup() + ", " + scheduler.getTriggerState(tKey) + ", " + t.getFinalFireTime() + ", " + t.getCronExpression()); } } finally { if (context != null) { context.close(); } System.out.println("Spring context is closed."); } } }
public class JobParameter { public static final String JOB_PARAM = "jobParam"; private String jobName; private String jobGroup; private String jobTrigger; private String status; private String cronExpression; private Boolean isSync = false; private String description; private Date updatedTime = new Date(); getter & setter ... }
public class MyJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobParameter jobParam = (JobParameter) jobExecutionContext.getJobDetail().getJobDataMap() .get(JobParameter.JOB_PARAM); if (jobParam != null) { System.out.println(jobParam.getDescription()); } else { System.out.println("Hey, can‘t find job parameter ...:)"); } } }
dynamic-jobs.xml
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
执行结果
Execute job 1 every 5 seconds ...
Execute job 2 every 5 seconds ...
Execute job 3 every 5 seconds ...
### 移除job3 ###
Execute job 1 every 5 seconds ...
Execute job 2 every 5 seconds ...
### 暂停job1和job2 ###
### 再次启动job1 ###
Execute job 1 every 5 seconds ...
Execute job 1 every 5 seconds ...
### 修改job1的cron为每3秒执行一次 ###
Execute job 1 every 3 seconds ...
Execute job 1 every 3 seconds ...
### 打印内存中的所有 Job的状态 ###
Execute job 1 every 3 seconds ...
Trigger details: Job1, JobGroup1, NORMAL, null, 0/3 * * * * ?
Trigger details: Job2, JobGroup1, PAUSED, null, 0/5 * * * * ?
版本信息
Quartz版本:2.2.1
Spring版本:3.2.13
参考资料
http://www.meiriyouke.net/?p=82
完整例子代码见附件
一个Spring Scheduler (Quartz) 动态添加,删除,修改任务的例子
原文地址:http://sulaohuai.blog.51cto.com/10674946/1702625