一個Spring Scheduler (Quartz) 動態新增,刪除,修改任務的例子
阿新 • • 發佈:2019-01-28
要求
根據任務清單執行不定數量,不定頻率的定時任務。並且需要動態新增,刪除,修改任務。
程式碼
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://sulaohuai.blog.51cto.com/10674946/1702625