1. 项目创建
File-->New-->Project...
Spring Initializr
Maven Project
Core
Lombok
Web
Web
Template Engines
Freemarker
SQL
mybatis
jdbc
mysql
I/O
Quartz Scheduler
-- 使用spring自带定时器的任务实现
2. springboot启用计划任务
2.1 @EnableScheduling
标注启动定时任务
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.2 @Scheduled
定义某个定时作业(或工作)
public class MyJob1 {
@Scheduled(cron = "*/5 * * * * ?")
public void execute() {
log.info("任务正执行:" + new Date().toLocaleString());
}
}
本章目标:在springboot中通过读取数据库的定时任务信息,动态生成quartz定时任务
1. 导入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!--quartz需要使用C3P0连接池将数据持久化到数据库-->
<!--Quartz各版本数据库连接池技术更新情况-->
<!--Quartz 2.0 以前 DBCP-->
<!--Quartz 2.0 以后 C3P0(包含2.0)-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
2. 在项目中添加quartz.properties文件(这样就不会加载自带的properties文件)
此文件的内容主要分为:scheduler,ThreadPool,JobStore,plugin,Datasources等部分
3. 在数据库中创建quartz相关的表
进入quartz的官网Quartz Enterprise Job Scheduler,点击Downloads,
下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本,例如:“tables_mysql.sql”
4. 自定义MyJobFactory,解决spring不能在quartz中注入bean的问题
MyJobFactory
Job由Qz框架创建,不是由spring创建
AutowireCapableBeanFactory
5. 创建调度器schedule
QuartzConfigration
@Configuration
@Bean
1通过springboot的内置qz将任务放入到数据库的表文件里面去(自定义创建的表)
2.通过任务调度器获取表文件内的任务详情然后调用qz的调度器进行运行
6. 创建自定义任务
注1:继承org.quartz.Job或org.springframework.scheduling.quartz.QuartzJobBean创建任务,可通过JobExecutionContext传参
7. 更新quartz中的任务
首先我们需要自己创建一张表t_schedule_trigger,用来存放trigger的信息,然后从数据库读取这些信息来随时更新定时任务
注意:job_name存放的任务类的全路径,在quartz中通过jobName和jobGroup来确定trigger的唯一性,所以这两列为联合唯一索引
注1:t_schedule_trigger的子表t_schedule_trigger_param还可以用来传递额外添加到任务中的参数
7. 小结
要搞清楚一个问题:从数据库读取任务信息动态生成定时任务,和把quartz持久化到数据库是没有关系的。
前者是我们自己定义的业务表,而后者是quartz使用自己的表来存储信息。持久化到数据库后,
就算服务器重启或是多个quartz节点也没关系,因为他们共享数据库中的任务信息。
附录一:AutowireCapableBeanFactory
对于想要拥有自动装配能力,并且想把这种能力暴露给外部应用的BeanFactory类需要实现此接口。
正常情况下,不要使用此接口,应该更倾向于使用BeanFactory或者ListableBeanFactory接口。此接口主要是针对框架之外,没有向Spring托管Bean的应用。通过暴露此功能,Spring框架之外的程序,具有自动装配等Spring的功能。
需要注意的是,ApplicationContext接口并没有实现此接口,因为应用代码很少用到此功能,如果确实需要的话,可以调用ApplicationContext的getAutowireCapableBeanFactory方法,来获取此接口的实例。
如果一个类实现了此接口,那么很大程度上它还需要实现BeanFactoryAware接口。它可以在应用上下文中返回BeanFactory
附录二:@Configuration注解
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,
被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext
或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:
1. @Configuration不可以是final类型;
2. @Configuration不可以是匿名类;
3. 嵌套的configuration必须是静态类。
附录三:quartz表简介
QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息
QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和时区信息
QRTZ_FIRED_TRIGGERS 存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的 Trigger组的信息
QRTZ_SCHEDULER_STATE 存储少量的有关 Scheduler 的状态信息,和别的Scheduler实例(假如是用于一个集群中)
QRTZ_LOCKS 存储程序的悲观锁的信息(假如使用了悲观锁)
QRTZ_JOB_DETAILS 存储每一个已配置的 Job 的详细信息
QRTZ_JOB_LISTENERS 存储有关已配置的 JobListener的信息
QRTZ_SIMPLE_TRIGGERS存储简单的Trigger,包括重复次数,间隔,以及已触的次数
QRTZ_BLOG_TRIGGERS Trigger 作为 Blob 类型存储(用于 Quartz 用户用JDBC创建他们自己定制的 Trigger 类型,JobStore并不知道如何存储实例的时候)
QRTZ_TRIGGER_LISTENERS 存储已配置的 TriggerListener的信息
QRTZ_TRIGGERS 存储已配置的 Trigger 的信息
@EnableScheduling
@Scheduled的
@Configuration
注1:继承QuartzJobBean创建作业,可通过JobExecutionContext传参