spring+quartz 实现定时任务二

在上一篇文章里面,已经可以启动定时器完成预期任务了.

这个时候,客户提了个新的需求,需要在界面可以修改任务的启动间隔,这要怎么处理呢?

其实是很简单的,quartz天生自带这个功能.

为什么这么说呢,回想第一篇里面的,我是图省事才把所有需要的bean都配置在spring里面,有spring来注入和管理的

现在这个要求,把spring的工作拿出来自己做就是了.

1. 把上篇的所有配置全部删掉,只保留quartz的工厂bean

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" /> 

2.把所有的任务信息保存进数据库,其中class文件是真正要执行的task

3. 配置一个开机启动的task,启动quartz

<!-- quartz初始化任务,随着web项目的启动而启动 -->
<bean id="loadTask" class="com.aw.task.LoadTask" init-method="initTask" />

4. 实现LoadTask类

 1 public class LoadTask
 2 {
 3     private final Logger log = LoggerFactory.getLogger(this.getClass());     
 4     
 5     @Autowired
 6     private JobMapper jobMapper;  
 7     
 8     @Autowired
 9     private SchedulerFactoryBean schedulerFactoryBean;
10     
11     
12     
13     public Class<? extends Job> getJobClass(String className)
14     {
15         try
16         {
17             return (Class<? extends Job>) Class.forName(className);
18         } catch (ClassNotFoundException e)
19         {
20             log.error(className + "*********" + e.toString());
21             e.printStackTrace();
22         }
23         
24         return null;
25     }
26     
27     
28     public void initTask() throws SchedulerException {             
29         
30         log.info("task manager start...");
31         
32         Scheduler scheduler = schedulerFactoryBean.getScheduler();
33         
34         List<ScheduleJob> jobList = jobMapper.getAllJob();
35         
36         for(ScheduleJob job: jobList)
37         {
38             //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
39             TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
40             
41             //不存在,创建一个
42             CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
43             
44             if (null == trigger) {
45                 JobDetail jobDetail = JobBuilder.newJob(getJobClass(job.getClassName()))
46                     .withIdentity(job.getJobName(), job.getJobGroup()).build();
47                 jobDetail.getJobDataMap().put("scheduleJob", job);
48                 //表达式调度构建器
49                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
50                 //按新的cronExpression表达式构建一个新的trigger
51                 trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
52                 scheduler.scheduleJob(jobDetail, trigger);
53             } else {
54                 // Trigger已存在,那么更新相应的定时设置
55                 //表达式调度构建器
56                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job
57                     .getCronExpression());
58                 //按新的cronExpression表达式重新构建trigger
59                 trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
60                     .withSchedule(scheduleBuilder).build();
61                 //按新的trigger重新设置job执行
62                 scheduler.rescheduleJob(triggerKey, trigger);
63             }
64             
65         }
66         
67     }         
68 }

这样,上面的操作就可以把数据库里面定义的task保存起来了.

那怎么更新task的时间间隔呢?

5. 提供一个界面,让用户修改表里面的jobInterval字段,然后在修改成功后,执行下面的代码.

//自动注入task加载类
@Autowired
    private LoadTask loadTask;

//保存完成以后
loadTask.initTask();

就可以重新调度了

原文地址:https://www.cnblogs.com/raspberry/p/5534714.html