本文共 32788 字,大约阅读时间需要 109 分钟。
创建工程需要的
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 */ ListqueryScheduleParamLst(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 ListqueryScheduleParamLst(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 ListqueryScheduleParamLst(Integer triggerId) { return scheduleTriggerParamMapper.queryScheduleParamLst(triggerId); }}
ScheduleTriggerMapper
/** * 查询触发器中包含的所有任务 * @return */ ListqueryScheduleTriggerLst();
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 { ListscheduleTriggers = 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停止 MyJobpackage 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层
ScheduleTriggerServicepackage 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 */ ListqueryScheduleTriggerList();}
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 { ListscheduleTriggers = 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层
QuartzControllerpackage 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(); Listlist = 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
功能就不演示了与上方基本一致。定时任务修改界面 修改定时任务
转载地址:http://eurzi.baihongyu.com/