1. 程式人生 > >一個Spring Scheduler (Quartz) 動態新增,刪除,修改任務的例子

一個Spring Scheduler (Quartz) 動態新增,刪除,修改任務的例子

要求

根據任務清單執行不定數量,不定頻率的定時任務。並且需要動態新增,刪除,修改任務。

程式碼

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