博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
quartz之动态定时器实现
阅读量:3962 次
发布时间:2019-05-24

本文共 32788 字,大约阅读时间需要 109 分钟。

Spring整合Quartz

创建工程需要的

在这里插入图片描述

a、quartz调度框架是有内置表的

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

table_mysql.sqltable_mysql_innodb.sql   上述两者所有的数据库引擎不一样

导入quartz调度框架自带的表

导入内置表
详情见下

b、导入pom依赖

5.1.44
mysql
mysql-connector-java
${mysql.version}
runtime
org.quartz-scheduler
quartz-jobs
2.2.1
com.alibaba
druid-spring-boot-starter
1.1.10
src/main/java
**/*.xml
src/main/resources
*.properties
*.xml
*.yml
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true

DruidConnectionProvider.java(数据源拓展类)

package com.zxp.quartz02.util;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 19:11 */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.StdJDBCDelegateorg.quartz.jobStore.useProperties:falseorg.quartz.jobStore.dataSource:qzDS#org.quartz.dataSource.qzDS.connectionProvider.class:org.quartz.utils.PoolingConnectionProviderorg.quartz.dataSource.qzDS.connectionProvider.class:com.javaxl.q03.quartz.DruidConnectionProviderorg.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driverorg.quartz.dataSource.qzDS.URL:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8org.quartz.dataSource.qzDS.user:rootorg.quartz.dataSource.qzDS.password:rootorg.quartz.dataSource.qzDS.maxConnections:30org.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;    }}

generatorConfig.xml

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=123

c、在项目中添加quartz.properties文件(这样就不会加载自带的properties文件)

此文件的内容主要分为:scheduler,ThreadPool,JobStore,plugin,Datasources等部分,覆盖properties文件的目的是覆盖默认的数据源,更换为druid的数据配置
quartz.properties(更改默认数据源)
quartz默认采用的连接池是c3p0,现在流行Druid连接池有监控平台,需要手动换源。

##============================================================================# Configure Main Scheduler Properties 调度器属性#============================================================================org.quartz.scheduler.instanceName: DefaultQuartzSchedulerorg.quartz.scheduler.instanceId = AUTOorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction: falseorg.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount= 10org.quartz.threadPool.threadPriority: 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 60000#============================================================================# Configure JobStore#============================================================================#存储方式使用JobStoreTX,也就是数据库org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTXorg.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.zxp.quartz02.util.DruidConnectionProviderorg.quartz.dataSource.qzDS.driver: com.mysql.jdbc.Driverorg.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8org.quartz.dataSource.qzDS.user: rootorg.quartz.dataSource.qzDS.password: 123org.quartz.dataSource.qzDS.maxConnection: 10

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

package com.zxp.quartz02.quartz;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;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-04 11:45 */@Component@Slf4jpublic 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 jobInstance;    }}

e、创建调度器schedule,交给spring进行管理

QuartzConfiguration:quartz调度框架与spring框架整合的配置类,主要是要将org.quartz.Scheduler交给spring进行管理

package com.zxp.quartz02.quartz;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;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-04 11:46 */@Configurationpublic 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();    }}

以上Spring整合Quartz整合完毕

h、自定义任务表与quartz内置表的区分

自定义的业务表

-- 注意:job_name存放的任务类的全路径,在quartz中通过jobName和jobGroup来确定trigger的唯一性,所以这两列为联合唯一索引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));

quartz内置表

导入内置表
在这里插入图片描述
在这里插入图片描述

f、创建自定义任务以及 & g、更新quartz中的任务

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/test?useUnicode=true&characterEncoding=utf8    username: root    password: 123    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#显示日志logging:  level:    com.zxp.quartz02.mapper: debug

ScheduleTriggerParamMapper

**     * 查询出当前任务类对应所需的参数     * @param triggerId     * @return     */    List
queryScheduleParamLst(Integer triggerId);

ScheduleTriggerParamMapper.xml

ScheduleTriggerParamService

package com.zxp.quartz02.service;import com.zxp.quartz02.model.ScheduleTriggerParam;import java.util.List;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:43 */public interface ScheduleTriggerParamService {    public List
queryScheduleParamLst(Integer triggerId) ;}

ScheduleTriggerParamServiceImpl

package com.zxp.quartz02.service.impl;import com.zxp.quartz02.mapper.ScheduleTriggerParamMapper;import com.zxp.quartz02.model.ScheduleTriggerParam;import com.zxp.quartz02.service.ScheduleTriggerParamService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:46 */@Servicepublic class ScheduleTriggerParamServiceImpl implements ScheduleTriggerParamService {    @Autowired    private ScheduleTriggerParamMapper scheduleTriggerParamMapper;    @Override    public List
queryScheduleParamLst(Integer triggerId) { return scheduleTriggerParamMapper.queryScheduleParamLst(triggerId); }}

ScheduleTriggerMapper

/**     * 查询触发器中包含的所有任务     * @return     */    List
queryScheduleTriggerLst();

ScheduleTriggerMapper.xml

ScheduleTriggerServiceImpl

package com.zxp.quartz02.service.impl;import com.zxp.quartz02.mapper.ScheduleTriggerMapper;import com.zxp.quartz02.mapper.ScheduleTriggerParamMapper;import com.zxp.quartz02.model.ScheduleTrigger;import com.zxp.quartz02.model.ScheduleTriggerParam;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笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:40 */@Servicepublic class ScheduleTriggerServiceImpl {    @Autowired    private ScheduleTriggerMapper scheduleTriggerMapper;    @Autowired    private ScheduleTriggerParamMapper scheduleTriggerParamMapper;    @Autowired    private Scheduler scheduler;    @Scheduled(cron = "0/10 * * * * ?")    public void refreshScheduler(){        try {            List
scheduleTriggers = scheduleTriggerMapper.queryScheduleTriggerLst(); if(null!=scheduleTriggers){ for (ScheduleTrigger scheduleTrigger : scheduleTriggers) { String cron = scheduleTrigger.getCron(); //表达式 String jobName = scheduleTrigger.getJob_name(); //任务名称 String jobGroup = scheduleTrigger.getJob_group(); //任务分组 String status = scheduleTrigger.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
) Class.forName(jobName)) .withIdentity(jobName,jobGroup) .build(); //往Job任务中传递参数 JobDataMap jobDataMap = jobDetail.getJobDataMap(); List
params = scheduleTriggerParamMapper.queryScheduleParamLst(scheduleTrigger.getId()); for (ScheduleTriggerParam param : params) { jobDataMap.put(param.getName(),param.getValue()); } //创建表达式调度器 CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron); //创建Trigger cronTrigger=TriggerBuilder.newTrigger() .withIdentity(jobName,jobGroup) .withSchedule(cronSchedule) .build(); //将jobDetail和Trigger注入到scheduler调度器中 scheduler.scheduleJob(jobDetail,cronTrigger); }else{ //System.out.println("Quartz 调度任务中已存在该任务"); if(status.equals("0")){ JobKey jobKey = JobKey.jobKey(jobName, jobGroup); scheduler.deleteJob(jobKey); continue; } //调度器中的表达式 String cronExpression = cronTrigger.getCronExpression(); if(!cron.equals(cronExpression)){ //创建表达式调度器 CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron); //重构 cronTrigger=cronTrigger.getTriggerBuilder() .withIdentity(triggerKey) .withSchedule(cronSchedule) .build(); //刷新调度器 scheduler.rescheduleJob(triggerKey,cronTrigger); } } } } } catch (Exception e) { e.printStackTrace(); } }}

Quartz02Application

package com.zxp.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.zxp.quartz02.mapper")@EnableTransactionManagement@EnableScheduling@SpringBootApplicationpublic class Quartz02Application {    public static void main(String[] args) {        SpringApplication.run(Quartz02Application.class, args);    }}

案例

读取数据库中表达式启动定时任务1(每5s执行)
更改定时任务状态(启用/禁用),定时任务1停止
在这里插入图片描述
MyJob

package com.zxp.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;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:55 */@Component@Slf4jpublic class MyJob implements Job {    @Override    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        System.out.println("MyJob是一个空的任务计划,时间:"+new Date().toLocaleString());    }}

在这里插入图片描述

在这里插入图片描述
读取数据库中表达式启动定时任务2(每5s执行),在对应作业类中打印定时任务2携带的参数

在这里插入图片描述

MyJob1

package com.zxp.quartz02.quartz;import com.zxp.quartz02.service.ScheduleTriggerParamService;import lombok.extern.slf4j.Slf4j;import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.Date;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:57 */@Component@Slf4jpublic 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());    }}

在这里插入图片描述

读取数据库中表达式启动定时任务3(每20s执行改成每5s执行),更改数据库定时任务表达式,定时任务3对应执行策略相应发生改变。

在这里插入图片描述

package com.zxp.quartz02.quartz;import lombok.extern.slf4j.Slf4j;import org.quartz.*;import org.springframework.stereotype.Component;import java.util.Date;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:57 */@Component@Slf4jpublic 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"));    }}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
升级案例—简单版页面

解决模板[索引]可能不存在,也可能不被任何配置的模板解析器访问 在pom中添加

src/main/resources

要用Thymeleaf模板首先去yml文件配置

spring:  thymeleaf:    cache: false

Service层

ScheduleTriggerService

package com.zxp.quartz02.service;import com.zxp.quartz02.model.ScheduleTrigger;import java.util.List;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 20:24 */public interface ScheduleTriggerService {    ScheduleTrigger selectByPrimaryKey(Integer id);    int updateByPrimaryKeySelective(ScheduleTrigger record);    /**     * 查询触发器中包含的所有任务     * @return     */    List
queryScheduleTriggerList();}

ScheduleTriggerServiceImpl

package com.zxp.quartz02.service.impl;import com.zxp.quartz02.mapper.ScheduleTriggerMapper;import com.zxp.quartz02.mapper.ScheduleTriggerParamMapper;import com.zxp.quartz02.model.ScheduleTrigger;import com.zxp.quartz02.model.ScheduleTriggerParam;import com.zxp.quartz02.service.ScheduleTriggerService;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笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 18:40 */@Servicepublic class ScheduleTriggerServiceImpl implements ScheduleTriggerService {    @Autowired    private ScheduleTriggerMapper scheduleTriggerMapper;    @Autowired    private ScheduleTriggerParamMapper scheduleTriggerParamMapper;    @Autowired    private Scheduler scheduler;    @Scheduled(cron = "0/10 * * * * ?")    public void refreshScheduler(){        try {            List
scheduleTriggers = scheduleTriggerMapper.queryScheduleTriggerLst(); if(null!=scheduleTriggers){ for (ScheduleTrigger scheduleTrigger : scheduleTriggers) { String cron = scheduleTrigger.getCron(); //表达式 String jobName = scheduleTrigger.getJob_name(); //任务名称 String jobGroup = scheduleTrigger.getJob_group(); //任务分组 String status = scheduleTrigger.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
) Class.forName(jobName)) .withIdentity(jobName,jobGroup) .build(); //往Job任务中传递参数 JobDataMap jobDataMap = jobDetail.getJobDataMap(); List
params = scheduleTriggerParamMapper.queryScheduleParamLst(scheduleTrigger.getId()); for (ScheduleTriggerParam param : params) { jobDataMap.put(param.getName(),param.getValue()); } //创建表达式调度器 CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron); //创建Trigger cronTrigger= TriggerBuilder.newTrigger() .withIdentity(jobName,jobGroup) .withSchedule(cronSchedule) .build(); //将jobDetail和Trigger注入到scheduler调度器中 scheduler.scheduleJob(jobDetail,cronTrigger); }else{ //System.out.println("Quartz 调度任务中已存在该任务"); if(status.equals("0")){ JobKey jobKey = JobKey.jobKey(jobName, jobGroup); scheduler.deleteJob(jobKey); continue; } //调度器中的表达式 String cronExpression = cronTrigger.getCronExpression(); if(!cron.equals(cronExpression)){ //创建表达式调度器 CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron); //重构 cronTrigger=cronTrigger.getTriggerBuilder() .withIdentity(triggerKey) .withSchedule(cronSchedule) .build(); //刷新调度器 scheduler.rescheduleJob(triggerKey,cronTrigger); } } } } } catch (Exception e) { e.printStackTrace(); } } @Override public ScheduleTrigger selectByPrimaryKey(Integer id) { return scheduleTriggerMapper.selectByPrimaryKey(id); } @Override public int updateByPrimaryKeySelective(ScheduleTrigger record) { return scheduleTriggerMapper.updateByPrimaryKeySelective(record); } @Override public List
queryScheduleTriggerList() { return scheduleTriggerMapper.queryScheduleTriggerLst(); }}

Controller层

QuartzController

package com.zxp.quartz02.controller;import com.zxp.quartz02.model.ScheduleTrigger;import com.zxp.quartz02.service.ScheduleTriggerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import java.util.List;/** * @author笑笑 * @site www.xiaoxiao.com * @company * @create 2020-01-05 20:37 */@Controller@RequestMapping("/quartz")public class QuartzController {    @Autowired    private ScheduleTriggerService scheduleTriggerService;    @RequestMapping("/list")    public ModelAndView getAll(){        ModelAndView mv = new ModelAndView();        List
list = scheduleTriggerService.queryScheduleTriggerList(); mv.addObject("quartzList",list); mv.setViewName("list"); return mv; } @RequestMapping("/edit") public String editStatus(ScheduleTrigger scheduleTrigger){ int n = scheduleTriggerService.updateByPrimaryKeySelective(scheduleTrigger); return "redirect:/quartz/list"; } @RequestMapping("/proSave/{id}") public ModelAndView proSave(@PathVariable(value = "id") Integer id){ ModelAndView mv=new ModelAndView(); ScheduleTrigger scheduleTrigger = scheduleTriggerService.selectByPrimaryKey(id); mv.addObject("schedule",scheduleTrigger); mv.setViewName("edit"); return mv; }}

页面

list.html

    
定时任务主界面

定时任务

任务id 任务表达式 任务状态 job工作类 job分组 操作
启动 停止 修改

edit.html

    
定时任务修改界面

修改定时任务

任务表达式:
job工作类:
job分组:

在这里插入图片描述

功能就不演示了与上方基本一致。

转载地址:http://eurzi.baihongyu.com/

你可能感兴趣的文章
[心得] 近期更新&关于Infobright
查看>>
[杂记] 流量统计 & 短信接口
查看>>
[中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
查看>>
[设计] 原型界面设计利器 Balsamiq Mockups 推荐
查看>>
[闲话] 在西方的程序员眼里,东方的程序员是什么样的
查看>>
[管理] 成功之路的探寻 —— “三力” 理论
查看>>
[连载] Socket 深度探索 4 PHP (一)
查看>>
[无线] Android 系统开发学习杂记
查看>>
[无线] 浅析当代 LBS 技术
查看>>
[杂感] 缅怀乔布斯
查看>>
[无线] 让Android支持cmwap上网
查看>>
[无线] AndroidManifest.xml配置文件详解
查看>>
[移动] Mosquitto简要教程(安装/使用/测试)
查看>>
[HTML5] 关于HTML5(WebGL)的那点事
查看>>
自我反思
查看>>
初识网络编程
查看>>
东北赛选拔教训
查看>>
hash
查看>>
涨姿势了:求两个分子的最大公倍数
查看>>
快速幂
查看>>