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();

就可以重新调度了

时间: 2024-10-10 03:22:31

spring+quartz 实现定时任务二的相关文章

Spring+Quartz实现定时从FTP服务器读取文件并存入Oracel数据库

package com.nstc.safe.action; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import 

Spring + quartz实现定时发送邮件功能

在做具体的系统管理时,往往会有每隔一段时间发给用户一些邮件的业务,现在参考的网上的大部分代码,写下了我自己的代码. 在ApplicationContext.xml的内容如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.spr

Spring+Quartz实现定时执行任务的配置

1.要想使用Quartz 必须要引入相关的包:以下是我在项目中gradle中的配置: compile 'org.quartz-scheduler:quartz:2.1.1' 2.Scheduler的配置 <bean id="mockJobSchedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="schedule

spring+quartz 实现定时任务三

其实,上面2篇都已经可以完成所有客户的需求,在这一篇,记录实现过程遇见一个很奇怪的问题. 那就是spring的自动加载 在真正的task里面,难免需要完成对数据库的操作,这样就需要自动注入service. 但是很奇怪,无论如何,无法注入,折腾了很久,service都是null. 于是采用迂回的方式完成bean的注入. 1. 在spring配置文件里面定义一个获取上下文的bean <bean id ="getContext" class="com.aw.task.Appl

Spring整合Quartz实现定时任务调度

一. 核心类 1. Job: 表示一个工作, 具体的业务处理都在这里. 2. JobDetail: 表示一个具体的可执行的调度程序. 3. Trigger: 用于调度参数的配置(什么时候去调用Job). 4. Scheduler: 表示一个调度容器, 容器中有一个线程池, 用来并行调度执行每个作业, 一个调度容器中可以注册多个JobDetail和Trigger. 二. 整合spring 1. 代码结构图: 2. applicationContext.xml <?xml version="1

Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2016年7月7日 09:06:09 星期四 http://fanshuya

【微信】微信获取TOKEN,以及储存TOKEN方法,Spring quartz让Token永不过期

官网说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 公众平台的API调用所需的access_token的使用及生成方式说明: 1.为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器.而其他业务逻辑服务器所

Spring+quartz 实现定时任务job集群配置

为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真实结果的3倍,那对银行来说是无法想象的,完全不可接受. 集群定时任务工作原理 所以为了解决以上问题,每个server把将要及正在运行的job所有状态都即时同步到中央数据库,然后再次触发调用时从数据库中分析是否已有别的server正在运行相同job (同名同定时时间点的job属于相当job),如果相同

atititt.java定时任务框架选型Spring Quartz 注解总结

atititt.java定时任务框架选型Spring Quartz 总结 1. .Spring Quartz  (ati recomm) 1 2. Spring Quartz具体配置 2 2.1. 增加context,task命名空间xml: 2 2.2. 增加xsi:schemaLocation valide 2 2.3. 我们的task任务扫描注解in spr.xml 2 2.4. 设置运行方法 3 2.5. 设置输出日志 3 3. 运行测试sprX走ok兰. 4 4. Quartz Sch