SpringBoot+Quartz+数据库存储

1. 项目创建

File–>New–>Project…
Spring Initializr
Maven Project
Core
Lombok
Web
Web
Template Engines
Freemarker
SQL
mybatis
jdbc
mysql
I/O
Quartz Scheduler

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

在数据库中创建quartz相关的表

进入quartz的官网http://www.quartz-scheduler.org/,点击Downloads,
下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本,例如:“tables_mysql.sql”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导入数据库中
在这里插入图片描述
新建数据库表

create table t_schedule_trigger
(
  id int primary key auto_increment,                                -- ID
  cron varchar(200) not null,                                       -- 时间表达式
  status char(1) not null,                                          -- 使用状态 0:禁用   1:启用
  job_name varchar(200) not null,                                   -- 任务名称
  job_group varchar(200) not null,                                  -- 任务分组  
  unique index(job_name,job_group)
);

create table t_schedule_trigger_param
(
  param_id int primary key auto_increment,                                -- ID
  name varchar(200) not null,                                             -- 参数名
  value varchar(512),                                                     -- 参数值
 
  schedule_trigger_id int not null,                                       -- 外键:引用t_schedule_trigger(id)
  foreign key(schedule_trigger_id) references t_schedule_trigger(id)
);

INSERT INTO `t_schedule_trigger` VALUES ('1', '0/5 * * * * ?', '1', 'com.javachz.quartz02.quartz.MyJob', 'group1');
INSERT INTO `t_schedule_trigger` VALUES ('2', '0/5 * * * * ?', '1', 'com.javachz.quartz02.quartz.MyJob1', 'group2');
INSERT INTO `t_schedule_trigger` VALUES ('3', '0/20 * * * * ?', '0', 'com.javachz.quartz02.quartz.MyJob2', 'group3');
INSERT INTO `t_schedule_trigger_param` VALUES ('1', 'job', '王舞', '2');
INSERT INTO `t_schedule_trigger_param` VALUES ('2', 'level', '李黎', '2');
INSERT INTO `t_schedule_trigger_param` VALUES ('3', 'name', '木棉', '3');
INSERT INTO `t_schedule_trigger_param` VALUES ('4', 'score', '无痕', '3');

自定义MyJobFactory,解决spring不能在quartz中注入bean的问题

MyJobFactory

package com.javachz.quartz02.utils;

import lombok.extern.slf4j.Slf4j;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyJobFactory extends AdaptableJobFactory {

    //这个对象Spring会帮我们自动注入进来
    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    //重写创建Job任务的实例方法
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        //通过以下方式,解决Job任务无法使用Spring中的Bean问题
        autowireCapableBeanFactory.autowireBean(jobInstance);
        return super.createJobInstance(bundle);
    }
}

创建调度器schedule

package com.javachz.quartz02.quartz;

import com.javachz.quartz02.entity.ScheduleTrigger;
import com.javachz.quartz02.entity.ScheduleTriggerParam;
import com.javachz.quartz02.mapper.ScheduleTriggerMapper;
import com.javachz.quartz02.mapper.ScheduleTriggerParamMapper;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 52hz
 * @site www.javachz.com
 * @company xxx公司
 * @create  2020-01-05 20:00
 * 自带定时任务工作类
 */
@Service
public class Schedule {
    @Autowired
    private ScheduleTriggerMapper scheduleTriggerMapper;
    @Autowired
    private ScheduleTriggerParamMapper scheduleTriggerParamMapper;
    @Autowired
    private Scheduler scheduler;
    @Scheduled(cron = "0/10 * * * * ?")
    public void refreshScheduler() throws  Exception{

        //获取数据库表中自定义表里的所有定时任务
        List<ScheduleTrigger> schedules = scheduleTriggerMapper.queryScheduleTriggerList();
        //对其进行判断,是否有定时任务
        if(null != schedules){
            //如果有 就进行循环
            for (ScheduleTrigger schedule : schedules) {
                String cron = schedule.getCron();  //表达式
                String jobName = schedule.getJob_name(); //任务名称
                String jobGroup = schedule.getJob_group(); //任务分组
                String status = schedule.getStatus();  //任务状态

                //JobName+JobGroup=Primary Key
                //根据jobName和jobGroup生成TriggerKey
                TriggerKey triggerKey = TriggerKey.triggerKey(jobName,jobGroup);

                //根据triggerkey到scheduler调度器中获取触发器
                //从官方内置表中获取
                CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);

                //判断官方内置表中有没有触发器
                if(null == cronTrigger){
                    //如果没有就判断其 启动状态
                    if(status.equals("0"))//如果没有启动就结束当前循环
                        continue;
                    //如果已经启动
                    System.out.println("创建调度器");
                    //创建任务详情
                    JobDetail jobDetail =
                            //获取表中对应作业类
                            JobBuilder.newJob((Class<? extends Job>) Class.forName(jobName))
                                    .withIdentity(jobName,jobGroup)
                                    .build();

                    //往job任务中传递参数
                    JobDataMap jobDataMap = jobDetail.getJobDataMap();
                    //根据id查询是否有参数
                    List<ScheduleTriggerParam> scheduleParams = scheduleTriggerParamMapper.queryScheduleTriggerParamList(schedule.getId());
                    //将查询出来的参数存放进map里
                    for (ScheduleTriggerParam sp : scheduleParams) {
                        jobDataMap.put(sp.getName(),sp.getValue());
                    }

                    //创建表达式调度器 调用可以使用的表达式
                    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

                    //创建Trigger 触发器
                    cronTrigger = TriggerBuilder.newTrigger()
                            .withIdentity(jobName,jobGroup)
                            .withSchedule(cronScheduleBuilder)
                            .build();
                    //将jobDetail和Trigger注入到scheduler调度器中

                    scheduler.scheduleJob(jobDetail,cronTrigger);

                }else{
                    //官方内置表里有值
                    if(status.equals("0")){
                        //如果为0 就删掉定时任务 然后结束
                        JobKey jobKey = JobKey.jobKey(jobName,jobGroup);
                        scheduler.deleteJob(jobKey);
                        continue;
                    }

                    //调度器中的表达式
                    String cronExpression = cronTrigger.getCronExpression();

                    if(!cron.equals(cronExpression)){//判断自定义表达式和数据库里官方表里的表达式是否一致
                        //不一致就证明表达式被更改 需要更新
                        //创建新表达式调度器
                        CronScheduleBuilder cronSchedule  = CronScheduleBuilder.cronSchedule(cron);

                        //重构 Trigger 触发器
                        cronTrigger = TriggerBuilder.newTrigger()
                                .withIdentity(jobName,jobGroup)
                                .withSchedule(cronSchedule)
                                .build();
                        //刷新
                        scheduler.rescheduleJob(triggerKey,cronTrigger);

                    }
                }
            }
        }
    }
}

创建自定义任务

package com.javachz.quartz02.quartz;

import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("MyJob是一个空的任务计划,时间:"+new Date().toLocaleString());
    }
}

package com.javachz.quartz02.quartz;

import com.javachz.quartz02.service.ScheduleTriggerParamService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class MyJob1 implements Job {

    @Autowired
    private ScheduleTriggerParamService scheduleTriggerParamService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail jobDetail =
                jobExecutionContext.getJobDetail();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        System.out.println(new Date().toLocaleString()+"-->携带参数个数:"+jobDataMap.size());
    }
}

package com.javachz.quartz02.quartz;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class MyJob2 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail jobDetail =
                jobExecutionContext.getJobDetail();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        System.out.println(new Date().toLocaleString()+"-->MyJob2参数传递name="+jobDataMap.get("name")+",score="+
                jobDataMap.get("score"));
    }
}

3、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hyf</groupId>
    <artifactId>quartz02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>quartz02</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <mysql.version>5.1.44</mysql.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <!-- 逆向工程插件-->
        <resources>
            <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>*.properties</include>
                    <include>*.xml</include>
                    <include>*.yml</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <dependencies>
                    <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4、Spring整合Quartz

配置数据库源

quartz.properties

#
#============================================================================
# Configure Main Scheduler Properties 调度器属性
#============================================================================
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount= 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================
#存储方式使用JobStoreTX,也就是数据库
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#使用自己的配置文件
org.quartz.jobStore.useProperties:true
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix:qrtz_
org.quartz.jobStore.dataSource:qzDS
#是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered = true
#============================================================================
# Configure Datasources
#============================================================================
#配置数据库源(org.quartz.dataSource.qzDS.maxConnections: c3p0配置的是有s的,druid数据源没有s)
org.quartz.dataSource.qzDS.connectionProvider.class:com.javachz.quartz02.utils.DruidConnectionProvider
org.quartz.dataSource.qzDS.driver: com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost/mysql?useUnicode=true&characterEncoding=UTF-8
org.quartz.dataSource.qzDS.user: root
org.quartz.dataSource.qzDS.password: 123456
org.quartz.dataSource.qzDS.maxConnection: 10

注:在项目中添加quartz.properties文件(这样就不会加载自带的properties文件)
此文件的内容主要分为:scheduler,ThreadPool,JobStore,plugin,Datasources等部分

DruidConnectionProvider.java

package com.javachz.quartz02.utils;

import com.alibaba.druid.pool.DruidDataSource;
import org.quartz.SchedulerException;
import org.quartz.utils.ConnectionProvider;

import java.sql.Connection;
import java.sql.SQLException;

/*
#============================================================================
# JDBC
#============================================================================
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:false
org.quartz.jobStore.dataSource:qzDS
#org.quartz.dataSource.qzDS.connectionProvider.class:org.quartz.utils.PoolingConnectionProvider
org.quartz.dataSource.qzDS.connectionProvider.class:com.zking.q03.quartz.DruidConnectionProvider
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:root
org.quartz.dataSource.qzDS.maxConnections:30
org.quartz.dataSource.qzDS.validationQuery: select 0
*/

/**
 * [Druid连接池的Quartz扩展类]
 *
 * @ProjectName: []
 * @Author: [xuguang]
 * @CreateDate: [2015/11/10 17:58]
 * @Update: [说明本次修改内容] BY[xuguang][2015/11/10]
 * @Version: [v1.0]
 */
public class DruidConnectionProvider implements ConnectionProvider {

     /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * 常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    //JDBC驱动
    public String driver;
    //JDBC连接串
    public String URL;
    //数据库用户名
    public String user;
    //数据库用户密码
    public String password;
    //数据库最大连接数
    public int maxConnection;
    //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。
    public String validationQuery;

    private boolean validateOnCheckout;

    private int idleConnectionValidationSeconds;

    public String maxCachedStatementsPerConnection;

    private String discardIdleConnectionsSeconds;

    public static final int DEFAULT_DB_MAX_CONNECTIONS = 10;

    public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;

    //Druid连接池
    private DruidDataSource datasource;

    /*
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    *
    * 接口实现
    *
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    public Connection getConnection() throws SQLException {
        return datasource.getConnection();
    }

    public void shutdown() throws SQLException {
        datasource.close();
    }
    public void initialize() throws SQLException{
        if (this.URL == null) {
            throw new SQLException("DBPool could not be created: DB URL cannot be null");
        }

        if (this.driver == null) {
            throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
        }

        if (this.maxConnection < 0) {
            throw new SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!");
        }

        datasource = new DruidDataSource();
        try{
            datasource.setDriverClassName(this.driver);
        } catch (Exception e) {
            try {
                throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
            } catch (SchedulerException e1) {
            }
        }

        datasource.setUrl(this.URL);
        datasource.setUsername(this.user);
        datasource.setPassword(this.password);
        datasource.setMaxActive(this.maxConnection);
        datasource.setMinIdle(1);
        datasource.setMaxWait(0);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(this.DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION);

        if (this.validationQuery != null) {
            datasource.setValidationQuery(this.validationQuery);
            if(!this.validateOnCheckout)
                datasource.setTestOnReturn(true);
            else
                datasource.setTestOnBorrow(true);
            datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);
        }
    }

    /*
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    *
    * 提供get set方法
    *
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getURL() {
        return URL;
    }

    public void setURL(String URL) {
        this.URL = URL;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getMaxConnection() {
        return maxConnection;
    }

    public void setMaxConnection(int maxConnection) {
        this.maxConnection = maxConnection;
    }

    public String getValidationQuery() {
        return validationQuery;
    }

    public void setValidationQuery(String validationQuery) {
        this.validationQuery = validationQuery;
    }

    public boolean isValidateOnCheckout() {
        return validateOnCheckout;
    }

    public void setValidateOnCheckout(boolean validateOnCheckout) {
        this.validateOnCheckout = validateOnCheckout;
    }

    public int getIdleConnectionValidationSeconds() {
        return idleConnectionValidationSeconds;
    }

    public void setIdleConnectionValidationSeconds(int idleConnectionValidationSeconds) {
        this.idleConnectionValidationSeconds = idleConnectionValidationSeconds;
    }

    public DruidDataSource getDatasource() {
        return datasource;
    }

    public void setDatasource(DruidDataSource datasource) {
        this.datasource = datasource;
    }
}

QuartzConfiguration

package com.javachz.quartz02.quartz;

import com.javachz.quartz02.utils.MyJobFactory;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.io.IOException;
import java.util.Properties;

@Configuration
public class QuartzConfiguration {

    @Autowired
    private MyJobFactory myJobFactory;

    //创建调度器工厂
    @Bean
        public SchedulerFactoryBean schedulerFactoryBean(){
            //1.创建SchedulerFactoryBean
            //2.加载自定义的quartz.properties配置文件
            //3.设置MyJobFactory

            SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
            try {
                factoryBean.setQuartzProperties(quartzProperties());
                factoryBean.setJobFactory(myJobFactory);
                return factoryBean;
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
    }

    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean=new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    @Bean(name="scheduler")
    public Scheduler scheduler(){
        return schedulerFactoryBean().getScheduler();
    }
}

application.yml

server:
  port: 80
  servlet:
    context-path: /

spring:
  datasource:
    #1.JDBC
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    druid:
      #2.连接池配置
      #初始化连接池的连接数量 大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      #3.基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        #设置不统计哪些URL
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        #设置监控页面的登录名和密码
        login-username: admin
        login-password: admin
        allow: 127.0.0.1
        #deny: 192.168.1.100
  thymeleaf:
    cache: false
#显示日志
logging:
  level:
    com.javachz.quartz02.mapper: debug


jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/mysql?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=10
jdbc.maxTotal=100
jdbc.maxIdle=50
jdbc.minIdle=10
jdbc.maxWaitMillis=-1

generatorConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!--指定数据库jdbc驱动jar包的位置-->
    <classPathEntry location="D:\\initPath\\mvn-repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.javachz.quartz02.entity"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.javachz.quartz02.mapper"
                         targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.javachz.quartz02.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->

        <!-- 配置表信息 -->
        <table schema="" tableName="t_schedule_trigger" domainObjectName="ScheduleTrigger"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true" />
        </table>
        <table schema="" tableName="t_schedule_trigger_param" domainObjectName="ScheduleTriggerParam"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true" />
        </table>


    </context>
</generatorConfiguration>

在这里插入图片描述

整合完毕,测试结果

Quartz02Application启动

package com.javachz.quartz02;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@MapperScan("com.javachz.quartz02.mapper")
@EnableTransactionManagement//事务管理器
@EnableScheduling//管理spring task
@SpringBootApplication
public class Quartz02Application {

    public static void main(String[] args) {
        SpringApplication.run(Quartz02Application.class, args);
    }

}

在这里插入图片描述

MyJob是一个空的任务计划,时间:2020-1-5 21:25:30
Sun Jan 05 21:25:30 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
MyJob是一个空的任务计划,时间:2020-1-5 21:25:35
2020-01-05 21:25:40.000 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-05 21:25:40.001 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-05 21:25:40.002 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
MyJob是一个空的任务计划,时间:2020-1-5 21:25:40
MyJob是一个空的任务计划,时间:2020-1-5 21:25:45
2020-01-05 21:25:50.025 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-05 21:25:50.026 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-05 21:25:50.037 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
MyJob是一个空的任务计划,时间:2020-1-5 21:25:50
MyJob是一个空的任务计划,时间:2020-1-5 21:25:55
2020-01-05 21:26:00.005 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-05 21:26:00.005 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-05 21:26:00.007 DEBUG 17412 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
MyJob是一个空的任务计划,时间:2020-1-5 21:26:00

在这里插入图片描述

创建调度器
2020-01-06 23:13:40.353 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : ==>  Preparing: select param_id, name, value, schedule_trigger_id from t_schedule_trigger_param where schedule_trigger_id=? 
2020-01-06 23:13:40.378 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : ==> Parameters: 2(Integer)
2020-01-06 23:13:40.390 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : <==      Total: 2
2020-1-6 23:13:40-->携带参数个数:2
2020-1-6 23:13:45-->携带参数个数:2
2020-01-06 23:13:50.003 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:13:50.007 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:13:50.011 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:13:50-->携带参数个数:2
Mon Jan 06 23:13:50 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2020-1-6 23:13:55-->携带参数个数:2
2020-01-06 23:14:00.005 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:14:00.005 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:14:00.011 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:14:00-->携带参数个数:2
2020-1-6 23:14:05-->携带参数个数:2
2020-01-06 23:14:10.002 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:14:10.003 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:14:10.008 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:14:10-->携带参数个数:2
2020-1-6 23:14:15-->携带参数个数:2
2020-01-06 23:14:20.007 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:14:20.008 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:14:20.015 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:14:20-->携带参数个数:2
2020-1-6 23:14:25-->携带参数个数:2
2020-01-06 23:14:30.019 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:14:30.020 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-1-6 23:14:30-->携带参数个数:2
2020-01-06 23:14:30.048 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:14:35-->携带参数个数:2
2020-01-06 23:14:40.007 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:14:40.007 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:14:40.011 DEBUG 11564 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:14:40-->携带参数个数:2

在这里插入图片描述

创建调度器
2020-01-06 23:17:40.333 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : ==>  Preparing: select param_id, name, value, schedule_trigger_id from t_schedule_trigger_param where schedule_trigger_id=? 
2020-01-06 23:17:40.348 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : ==> Parameters: 3(Integer)
2020-01-06 23:17:40.354 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerParamList  : <==      Total: 2
2020-1-6 23:17:40-->MyJob2参数传递name=木棉,score=无痕
2020-01-06 23:17:50.002 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:17:50.002 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:17:50.006 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-01-06 23:18:00.002 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==>  Preparing: select id, cron, status, job_name, job_group from t_schedule_trigger 
2020-01-06 23:18:00.003 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : ==> Parameters: 
2020-01-06 23:18:00.005 DEBUG 2080 --- [   scheduling-1] c.j.q.m.S.queryScheduleTriggerList       : <==      Total: 3
2020-1-6 23:18:00-->MyJob2参数传递name=木棉,score=无痕
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值