SpringBoot+redis数据储存+整合quartz

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传参

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值