springboot集成quartz

  • springboot集成quartz
    • 搭建项目环境
    • 更改环境配置
    • 测试
  • 对于定时管理(增删查改)

感觉写的有点乱,这个是源码,有兴趣的同学可以去研究一下
链接:https://pan.baidu.com/s/1yzag9fqxlcDwNDfOS_YV7g
提取码:pc8n

springboot集成quartz

搭建项目环境

先选择我们要的一些项目依赖

导入依赖:这里我就把pom里面的代码全部粘贴出来了

<?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.hu</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><version>5.1.44</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>5.1.44</version><scope>runtime</scope></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><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></dependencies><build><resources><!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

先给你们看一下我的文件目录吧!

对了,这里还有一个很重要的东西就是想要使用quartz定时任务就必须要有他内置的表,内置的表也有他下载的地方
进入quartz的官网http://www.quartz-scheduler.org/,点击Downloads,下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本,例如:“tables_mysql.sql,你是啥数据库就导入啥对应的 脚本就好了

table_mysql_innodb.sql 这个是针对 mysql中innodb 这个引擎的,如果你使用的是这个引擎就导入这个吧
quartz 内置表结构:


自己定义的表:

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

DruidConnectionProvider
druid的数据库连接池

package com.hu.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);elsedatasource.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;}
}

MyJobFactory,这里是解决bean注入的问题

package com.hu.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会帮我们自动注入进来@Autowiredprivate AutowireCapableBeanFactory autowireCapableBeanFactory;//重写创建Job任务的实例方法@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {Object jobInstance = super.createJobInstance(bundle);//通过以下方式,解决Job任务无法使用Spring中的Bean问题autowireCapableBeanFactory.autowireBean(jobInstance);return super.createJobInstance(bundle);}
}

更改环境配置

Quartz中有默认的连接方式(c3p0),但是小编感觉不好用就使用了Druid,而且Druid可以对于数据进行监控

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.hu.quartz02.utils.DruidConnectionProvider
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/tb_stu?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:123
org.quartz.dataSource.qzDS.maxConnection:10

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

package com.hu.quartz02.config;import com.hu.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 {@Autowiredprivate MyJobFactory myJobFactory;//创建调度器工厂@Beanpublic SchedulerFactoryBean schedulerFactoryBean(){//1.创建SchedulerFactoryBean//2.加载自定义的quartz.properties配置文件//3.设置MyJobFactorySchedulerFactoryBean factoryBean=new SchedulerFactoryBean();try {factoryBean.setQuartzProperties(quartzProperties());factoryBean.setJobFactory(myJobFactory);return factoryBean;} catch (IOException e) {throw new RuntimeException(e);}}@Beanpublic 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:servlet:context-path: /port: 80
spring:datasource:#1.JDBCtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/tb_stu?useUnicode=true&characterEncoding=utf8username: rootpassword: 123druid:#2.\u8FDE\u63A5\u6C60\u914D\u7F6E#\u521D\u59CB\u5316\u8FDE\u63A5\u6C60\u7684\u8FDE\u63A5\u6570\u91CF \u5927\u5C0F\uFF0C\u6700\u5C0F\uFF0C\u6700\u5927initial-size: 5min-idle: 5max-active: 20#\u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4max-wait: 60000#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2time-between-eviction-runs-millis: 60000# \u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2min-evictable-idle-time-millis: 30000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: truetest-on-return: false# \u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache  \u5B98\u65B9\u5EFA\u8BAEMySQL\u4E0B\u5EFA\u8BAE\u5173\u95ED   \u4E2A\u4EBA\u5EFA\u8BAE\u5982\u679C\u60F3\u7528SQL\u9632\u706B\u5899 \u5EFA\u8BAE\u6253\u5F00pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20# \u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899filter:stat:merge-sql: trueslow-sql-millis: 5000#3.\u57FA\u7840\u76D1\u63A7\u914D\u7F6Eweb-stat-filter:enabled: trueurl-pattern: /*#\u8BBE\u7F6E\u4E0D\u7EDF\u8BA1\u54EA\u4E9BURLexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: true#\u8BBE\u7F6E\u76D1\u63A7\u9875\u9762\u7684\u767B\u5F55\u540D\u548C\u5BC6\u7801login-username: adminlogin-password: adminallow: 127.0.0.1#deny: 192.168.1.100#\u663E\u793A\u65E5\u5FD7
logging:level:com.hu.quartz02.mapper: debug

测试

最重要的代码部分来了,ScheduleTriggerServiceImpl

@Service
public class ScheduleTriggerServiceImpl implements ScheduleTriggerService {//这个方法主要是对于Quartz内置的表的增删查改,也就是任务管理模块@Autowiredprivate ScheduleTriggerMapper scheduleTriggerMapper;@Autowiredprivate ScheduleTriggerParamMapper scheduleTriggerParamMapper;@Autowiredprivate Scheduler scheduler;//    @Scheduled(cron = "0/10 * * * * ?")//使用spring里的任务管理器每10秒调用这个方法一次public void refreshScheduler(){try {List<ScheduleTrigger> 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生成TriggerKeyTriggerKey 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();List<ScheduleTriggerParam> params =scheduleTriggerParamMapper.queryScheduleParamLst(scheduleTrigger.getId());for (ScheduleTriggerParam param : params) {jobDataMap.put(param.getName(),param.getValue());}//创建表达式调度器CronScheduleBuilder cronSchedule =CronScheduleBuilder.cronSchedule(cron);//创建TriggercronTrigger=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();}}
}

MyJob

package com.hu.quartz02.job;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 {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.err.println("MyJob是一个空的任务计划,时间:"+new Date().toLocaleString());}
}

MyJob1

package com.hu.quartz02.job;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;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {JobDetail jobDetail = jobExecutionContext.getJobDetail();JobDataMap jobDataMap = jobDetail.getJobDataMap();System.out.println(new Date().toLocaleString()+"-->携带参数个数:"+jobDataMap.size());}
}

MyJob2

package com.hu.quartz02.job;import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;import java.util.Date;@Component
@Slf4j
public class MyJob2 implements Job {@Overridepublic 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"));}
}

对于定时管理(增删查改)

业务逻辑模块

package com.hu.quartz02.job;import com.hu.quartz02.model.ScheduleTrigger;
import com.hu.quartz02.server.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.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;import java.util.List;@RestController
@RequestMapping("/quartz")
public class QuartzController {@Autowiredprivate ScheduleTriggerService scheduleTriggerService;@RequestMapping("/list")public ModelAndView getAll() {ModelAndView mv = new ModelAndView();List<ScheduleTrigger> list = scheduleTriggerService.queryScheduleTriggerLst();mv.addObject("quartzList", list);mv.setViewName("index");//scheduleTriggerService.refreshScheduler();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,edit

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>quartz定时任务管理</title>
</head>
<body>
<h1 style="text-align: center">定时任务管理</h1>
<table style="text-align: center" align="center" border="1px" width="50%"><tr><td>任务id</td><td>任务表达式</td><td>任务状态</td><td>job工作类</td><td>job分组</td><td>操作</td></tr><tr th:each="q : ${quartzList}"><td th:text="${q.id}"></td><td th:text="${q.cron}"></td><td th:text="${q.status}"></td><td th:text="${q.job_name}"></td><td th:text="${q.job_group}"></td><td th:switch ="${q.status} == 0"><a th:case="true" th:href="@{/quartz/edit(id=${q.id},status=1)}">启动</a><a th:case="false" th:href="@{/quartz/edit(id=${q.id},status=0)}">停止</a><a th:href="@{'/quartz/proSave/'+${q.id}}">编辑</a></td></tr>
</table></body>
</html>

edit

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>编辑定时任务</title>
</head>
<body>
<h1>编辑定时任务</h1>
<form th:action="@{/quartz/edit}" method="post"><input type="hidden" name="id" th:value="${schedule.id}" />任务表达式: <input width="300px" type="text" name="cron" th:value="${schedule.cron}" /></br>job工作类: <input width="300px" type="text" name="job_name" th:value="${schedule.job_name}" /></br>job分组:<input width="300px" type="text" name="job_group" th:value="${schedule.job_group}" /></br><input type="submit" value="提交"/>
</form>
</body>
</html>


springboot集成quartz相关推荐

  1. SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)

    SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null) 参考文章: (1)SpringBoot集成Quartz(解决@Autowired空指针Nu ...

  2. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  3. SpringBoot集成quartz定时调度任务并通过JDBC持久化

    SpringBoot集成quartz定时调度任务并通过JDBC持久化 话不多说上干货 项目pom依赖 配置类 抽象出调度任务实体类 调度执行和调度任务更改工具类 调度配置与执行的代码完毕,下面就是对持 ...

  4. Springboot集成quartz定时任务可视化配置​​​​​​​

    转自我的个人博客:Springboot集成quartz定时任务可视化配置 使用quartz定时任务已经有一段时间了,今天记录一下Springboot 2.x集成Quartz. 1.引入quartz j ...

  5. SpringBoot集成Quartz框架

    SpringBoot集成Quartz框架 (一)集成环境: ​ Win10系统 ​ JDK版本:11.0.13 ​ SpringBoot版本:2.3.4.RELEASE ​ Quartz版本:2.3. ...

  6. SpringBoot - 集成Quartz框架:Couldn‘t acquire next trigger: Couldn‘t retrieve trigger: 不良的类型值 long : \x

    写在前面 SpringBoot 集成Quartz框架时,数据保存方式使用PostgreSQL进行数据库持久化. 报错如下: Couldn't acquire next trigger: Couldn' ...

  7. SpringBoot集成Quartz(定时任务)

    SpringBoot集成Quartz(定时任务)_鱼找水需要时间的博客-CSDN博客_springboot集成quartz

  8. 定时任务:springboot集成Quartz实现多任务多触发的动态管理

    本文主要讲解以下几个方面: 1.定时任务的定义及其常见的模式 2.springboot集成quart实例 3.中途会遇到的一些问题 一.定时任务的定义及其常见的模式 1)定时任务的定义 首先要明白的是 ...

  9. SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  10. SpringBoot集成Quartz实现定时任务

    1.Quartz官网 http://www.quartz-scheduler.org/ Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商 ...

最新文章

  1. Linux C编程之二:Linux基础
  2. 关于Apache不能解析html内容
  3. [redis] Redis 常用命令
  4. hadoop官方文档_hadoop体系简介
  5. Java PECS
  6. 读取无线手柄数据_《宇宙机器人》×PS5手柄使用体验:登月级进化
  7. 从Java到Go面向对象--继承思想.md
  8. 编程之美 - 哪个题目最美?
  9. PyQt5 打包问题解决 Unable to find “D:\anaconda3\lib\site-packages\PyQt5\Qt\translations\qtwebengine_locale
  10. 42 FI配置-财务会计-固定资产-组织结构-将折旧表分配至公司代码
  11. 【Go语言】集合与文件操作
  12. kmeans及模型评估指标_使用sklearn评估器构建聚类模型
  13. (C#)xml的简单理解创建和读取
  14. 利用shell脚本远程磁盘分区
  15. Word基础(八)带圈字符
  16. 游戏付费中的金融学和心理学小知识
  17. 【神经网络】神经元模型和感知器
  18. 如何设置内网打印机端口网络穿透到公网
  19. linux怎么cat结果导出txt,cat 输出文件内容
  20. top 100 percent

热门文章

  1. Xcode9 Could not receive a message from the device
  2. visio2016上下标
  3. 常用手机屏幕显示级别与分辨率对照
  4. IDEA debug提示Connected to the target VM, address: ‘127.0.0.1:xxxxx‘, transport: ‘socket‘的原因
  5. 信号与系统 chapter5 线性系统与非线性系统
  6. linux运维工程师的发展,Linux运维工程师发展前景
  7. win10读取linux硬盘,win10怎么读取lxext4格式硬盘
  8. xp桌面计算机在哪个文件夹,XP电脑的桌面背景在哪个文件夹?
  9. MMKV_高性能MMKV数据交互分析-MMKV初始化
  10. vscode 软件 git提交代码步骤(结合webstorm软件)