当前位置:Gxlcms > 数据库问题 > SpringBoot+Quartz+数据库存储

SpringBoot+Quartz+数据库存储

时间:2021-07-01 10:21:17 帮助过:7人阅读

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.hmc</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> </properties> <dependencies> <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> <scope>runtime</scope> <version>5.1.44</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <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> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <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>5.1.44</version> </dependency> </dependencies> <configuration> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </build> </project>

更换成Druid连接池
技术图片

 

 

 

 

 DruidConnectionProvider.java

  1. <span style="color: #000000;">package com.hmc.quartz02.util;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.quartz.SchedulerException;
  4. import org.quartz.utils.ConnectionProvider;
  5. import java.sql.Connection;
  6. import java.sql.SQLException;
  7. /*
  8. #============================================================================
  9. # JDBC
  10. #============================================================================
  11. org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  12. org.quartz.jobStore.useProperties:false
  13. org.quartz.jobStore.dataSource:qzDS
  14. #org.quartz.dataSource.qzDS.connectionProvider.class:org.quartz.utils.PoolingConnectionProvider
  15. org.quartz.dataSource.qzDS.connectionProvider.class:com.zking.q03.quartz.DruidConnectionProvider
  16. org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
  17. org.quartz.dataSource.qzDS.URL:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true</span><span style="color: #ff0000;">&characterEncoding</span><span style="color: #000000;">=UTF-8
  18. org.quartz.dataSource.qzDS.user:root
  19. org.quartz.dataSource.qzDS.password:root
  20. org.quartz.dataSource.qzDS.maxConnections:30
  21. org.quartz.dataSource.qzDS.validationQuery: select 0
  22. */
  23. /**
  24. * [Druid连接池的Quartz扩展类]
  25. */
  26. public class DruidConnectionProvider implements ConnectionProvider {
  27. /*
  28. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  29. *
  30. * 常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。
  31. *
  32. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  33. */
  34. //JDBC驱动
  35. public String driver;
  36. //JDBC连接串
  37. public String URL;
  38. //数据库用户名
  39. public String user;
  40. //数据库用户密码
  41. public String password;
  42. //数据库最大连接数
  43. public int maxConnection;
  44. //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。
  45. public String validationQuery;
  46. private boolean validateOnCheckout;
  47. private int idleConnectionValidationSeconds;
  48. public String maxCachedStatementsPerConnection;
  49. private String discardIdleConnectionsSeconds;
  50. public static final int DEFAULT_DB_MAX_CONNECTIONS = 10;
  51. public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;
  52. //Druid连接池
  53. private DruidDataSource datasource;
  54. /*
  55. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  56. *
  57. * 接口实现
  58. *
  59. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  60. */
  61. public Connection getConnection() throws SQLException {
  62. return datasource.getConnection();
  63. }
  64. public void shutdown() throws SQLException {
  65. datasource.close();
  66. }
  67. public void initialize() throws SQLException{
  68. if (this.URL == null) {
  69. throw new SQLException("DBPool could not be created: DB URL cannot be null");
  70. }
  71. if (this.driver == null) {
  72. throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
  73. }
  74. if (this.maxConnection </span><span style="color: #0000ff;"><</span><span style="color: #800000;"> 0</span><span style="color: #ff0000;">) {
  75. throw new SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!");
  76. }
  77. datasource </span><span style="color: #0000ff;">= new </span><span style="color: #ff0000;">DruidDataSource();
  78. try{
  79. datasource.setDriverClassName(this.driver);
  80. } catch (Exception e) {
  81. try {
  82. throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
  83. } catch (SchedulerException e1) {
  84. }
  85. }
  86. datasource.setUrl(this.URL);
  87. datasource.setUsername(this.user);
  88. datasource.setPassword(this.password);
  89. datasource.setMaxActive(this.maxConnection);
  90. datasource.setMinIdle(1);
  91. datasource.setMaxWait(0);
  92. datasource.setMaxPoolPreparedStatementPerConnectionSize(this.DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION);
  93. if (this.validationQuery !</span><span style="color: #0000ff;">= null) </span><span style="color: #ff0000;">{
  94. datasource.setValidationQuery(this.validationQuery);
  95. if(!this.validateOnCheckout)
  96. datasource.setTestOnReturn(true);
  97. else
  98. datasource.setTestOnBorrow(true);
  99. datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);
  100. }
  101. }
  102. /*
  103. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  104. *
  105. * 提供get set方法
  106. *
  107. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  108. */
  109. public String getDriver() {
  110. return driver;
  111. }
  112. public void setDriver(String driver) {
  113. this.driver </span><span style="color: #0000ff;">= driver;
  114. </span><span style="color: #ff0000;">}
  115. public String getURL() {
  116. return URL;
  117. }
  118. public void setURL(String URL) {
  119. this.URL </span><span style="color: #0000ff;">= URL;
  120. </span><span style="color: #ff0000;">}
  121. public String getUser() {
  122. return user;
  123. }
  124. public void setUser(String user) {
  125. this.user </span><span style="color: #0000ff;">= user;
  126. </span><span style="color: #ff0000;">}
  127. public String getPassword() {
  128. return password;
  129. }
  130. public void setPassword(String password) {
  131. this.password </span><span style="color: #0000ff;">= password;
  132. </span><span style="color: #ff0000;">}
  133. public int getMaxConnection() {
  134. return maxConnection;
  135. }
  136. public void setMaxConnection(int maxConnection) {
  137. this.maxConnection </span><span style="color: #0000ff;">= maxConnection;
  138. </span><span style="color: #ff0000;">}
  139. public String getValidationQuery() {
  140. return validationQuery;
  141. }
  142. public void setValidationQuery(String validationQuery) {
  143. this.validationQuery </span><span style="color: #0000ff;">= validationQuery;
  144. </span><span style="color: #ff0000;">}
  145. public boolean isValidateOnCheckout() {
  146. return validateOnCheckout;
  147. }
  148. public void setValidateOnCheckout(boolean validateOnCheckout) {
  149. this.validateOnCheckout </span><span style="color: #0000ff;">= validateOnCheckout;
  150. </span><span style="color: #ff0000;">}
  151. public int getIdleConnectionValidationSeconds() {
  152. return idleConnectionValidationSeconds;
  153. }
  154. public void setIdleConnectionValidationSeconds(int idleConnectionValidationSeconds) {
  155. this.idleConnectionValidationSeconds </span><span style="color: #0000ff;">= idleConnectionValidationSeconds;
  156. </span><span style="color: #ff0000;">}
  157. public DruidDataSource getDatasource() {
  158. return datasource;
  159. }
  160. public void setDatasource(DruidDataSource datasource) {
  161. this.datasource </span><span style="color: #0000ff;">= datasource;
  162. </span><span style="color: #ff0000;">}
  163. }</span>

 

导入自定义quartz.properties文件,因为quartz默认使用的是c3p0数据库连接池,我们要使用Druid

 

  1. <span style="color: #000000;">#
  2. #============================================================================
  3. # Configure Main Scheduler Properties 调度器属性
  4. #============================================================================
  5. org.quartz.scheduler.instanceName: DefaultQuartzScheduler
  6. org.quartz.scheduler.instanceId = AUTO
  7. org.quartz.scheduler.rmi.export: false
  8. org.quartz.scheduler.rmi.proxy: false
  9. org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
  10. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
  11. org.quartz.threadPool.threadCount= 10
  12. org.quartz.threadPool.threadPriority: 5
  13. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
  14. org.quartz.jobStore.misfireThreshold: 60000
  15. #============================================================================
  16. # Configure JobStore
  17. #============================================================================
  18. #存储方式使用JobStoreTX,也就是数据库
  19. org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
  20. org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  21. #使用自己的配置文件
  22. org.quartz.jobStore.useProperties:true
  23. #数据库中quartz表的表名前缀
  24. org.quartz.jobStore.tablePrefix:qrtz_
  25. org.quartz.jobStore.dataSource:qzDS
  26. #是否使用集群(如果项目只部署到 一台服务器,就不用了)
  27. org.quartz.jobStore.isClustered = true
  28. #============================================================================
  29. # Configure Datasources
  30. #============================================================================
  31. #配置数据库源
  32. org.quartz.dataSource.qzDS.connectionProvider.class: com.hmc.quartz02.util.DruidConnectionProvider
  33. org.quartz.dataSource.qzDS.driver: com.mysql.jdbc.Driver
  34. org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/book?useUnicode=true</span><span style="color: #ff0000;">&characterEncoding</span><span style="color: #000000;">=utf8
  35. org.quartz.dataSource.qzDS.user: root
  36. org.quartz.dataSource.qzDS.password: 123
  37. org.quartz.dataSource.qzDS.maxConnection: 10</span>

自定义的业务表
– 注意:job_name存放的任务类的全路径,在quartz中通过jobName和jobGroup来确定trigger的唯一性,所以这两列为联合唯一索引

  1. <span style="color: #000000;">create table t_schedule_trigger
  2. (
  3. id int primary key auto_increment, -- ID
  4. cron varchar(200) not null, -- 时间表达式
  5. status char(1) not null, -- 使用状态 0:禁用 1:启用
  6. job_name varchar(200) not null, -- 任务名称
  7. job_group varchar(200) not null, -- 任务分组
  8. unique index(job_name,job_group)
  9. );
  10. -- 额外添加到任务中的参数
  11. create table t_schedule_trigger_param
  12. (
  13. param_id int primary key auto_increment, -- ID
  14. name varchar(200) not null, -- 参数名
  15. value varchar(512), -- 参数值
  16. schedule_trigger_id int not null, -- 外键:引用t_schedule_trigger(id)
  17. foreign key(schedule_trigger_id) references t_schedule_trigger(id)
  18. );</span>

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

  1. <span style="color: #000000;">package com.hmc.quartz02.quartz;
  2. import org.quartz.Scheduler;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.config.PropertiesFactoryBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.core.io.ClassPathResource;
  8. import org.springframework.scheduling.quartz.SchedulerFactoryBean;
  9. import java.io.IOException;
  10. import java.util.Properties;
  11. /**
  12. * 创建配置类
  13. */
  14. @Configuration
  15. public class QuartzConfiguration {
  16. @Autowired
  17. private MyJobFactory myJobFactory;
  18. @Bean
  19. public SchedulerFactoryBean schedulerFactoryBean(){
  20. SchedulerFactoryBean sc=new SchedulerFactoryBean();
  21. try {
  22. //加载自定义的quartz.properties文件
  23. sc.setQuartzProperties(quartzProperties());
  24. //设置自定义的JobFactory工程类,解决Spring不能再Quartz框架中Bean的注入问题
  25. sc.setJobFactory(myJobFactory);
  26. return sc;
  27. } catch (IOException e) {
  28. throw new RuntimeException(e);
  29. }
  30. }
  31. //指定quartz.properties
  32. @Bean
  33. public Properties quartzProperties() throws IOException {
  34. //创建Properties属性工厂Bean类
  35. PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
  36. //加载自定义的quartz.properties
  37. propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
  38. propertiesFactoryBean.afterPropertiesSet();
  39. return propertiesFactoryBean.getObject();
  40. }
  41. //创建schedule
  42. @Bean(name = "scheduler")
  43. public Scheduler scheduler() {
  44. //从调度器工厂Bean中获取调取度实例对象
  45. return schedulerFactoryBean().getScheduler();
  46. }
  47. }</span>

 

 

application.yml

  1. <span style="color: #000000;">server:
  2. port: 8080
  3. servlet:
  4. context-path: /
  5. spring:
  6. datasource:
  7. #1.JDBC
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. driver-class-name: com.mysql.jdbc.Driver
  10. url: jdbc:mysql://localhost:3306/book?useUnicode=true</span><span style="color: #ff0000;">&characterEncoding</span><span style="color: #000000;">=utf8
  11. username: root
  12. password: 123
  13. druid:
  14. #2.连接池配置
  15. #初始化连接池的连接数量 大小,最小,最大
  16. initial-size: 5
  17. min-idle: 5
  18. max-active: 20
  19. #配置获取连接等待超时的时间
  20. max-wait: 60000
  21. #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  22. time-between-eviction-runs-millis: 60000
  23. # 配置一个连接在池中最小生存的时间,单位是毫秒
  24. min-evictable-idle-time-millis: 30000
  25. validation-query: SELECT 1 FROM DUAL
  26. test-while-idle: true
  27. test-on-borrow: true
  28. test-on-return: false
  29. # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
  30. pool-prepared-statements: true
  31. max-pool-prepared-statement-per-connection-size: 20
  32. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall‘用于防火墙
  33. filter:
  34. stat:
  35. merge-sql: true
  36. slow-sql-millis: 5000
  37. #3.基础监控配置
  38. web-stat-filter:
  39. enabled: true
  40. url-pattern: /*
  41. #设置不统计哪些URL
  42. exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
  43. session-stat-enable: true
  44. session-stat-max-count: 100
  45. stat-view-servlet:
  46. enabled: true
  47. url-pattern: /druid/*
  48. reset-enable: true
  49. #设置监控页面的登录名和密码
  50. login-username: admin
  51. login-password: admin
  52. allow: 127.0.0.1
  53. #mybatis配置
  54. mybatis:
  55. #配置SQL映射文件路径
  56. mapper-locations: classpath:mapper/*.xml
  57. #驼峰命名
  58. configuration:
  59. map-underscore-to-camel-case: true
  60. logging:
  61. level:
  62. #???????sql???
  63. com.hmc.quartz02.mapper: debug
  64. #deny: 192.168.1.100</span>

Quartz02Application.java

  1. <span style="color: #000000;">package com.hmc.quartz02;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cache.annotation.EnableCaching;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.scheduling.annotation.EnableScheduling;
  9. import org.springframework.transaction.annotation.EnableTransactionManagement;
  10. import org.springframework.web.cors.CorsConfiguration;
  11. import org.springframework.web.cors.CorsConfiguration;
  12. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  13. import org.springframework.web.filter.CorsFilter;
  14. @SpringBootApplication
  15. @MapperScan("com.hmc.quartz02.mapper")
  16. @EnableTransactionManagement
  17. @EnableScheduling
  18. public class Quartz02Application {
  19. public static void main(String[] args) {
  20. SpringApplication.run(Quartz02Application.class, args);
  21. }
  22. }</span>

 

mapper层

  1. <span style="font-size: 14pt;">ScheduleTriggerParamMapper<br></span>
  1. <span style="color: #000000;">package com.hmc.quartz02.mapper;
  2. import com.hmc.quartz02.model.ScheduleTriggerParam;
  3. import org.springframework.stereotype.Repository;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import java.util.List;
  6. @Repository
  7. public interface ScheduleTriggerParamMapper {
  8. /**
  9. * 根据定时任务id获取任务对应的执行参数信息
  10. */
  11. List</span><span style="color: #0000ff;"><</span><span style="color: #800000;">ScheduleTriggerParam</span><span style="color: #0000ff;">></span><span style="color: #000000;"> queryScheduleParams(Integer id);
  12. }</span>

 

ScheduleTriggerParamMapper.xml

  1. <span style="color: #0000ff;"><?</span><span style="color: #ff00ff;">xml version="1.0" encoding="UTF-8" </span><span style="color: #0000ff;">?></span>
  2. <span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" </span><span style="color: #0000ff;">></span>
  3. <span style="color: #0000ff;"><</span><span style="color: #800000;">mapper </span><span style="color: #ff0000;">namespace</span><span style="color: #0000ff;">="com.hmc.quartz02.mapper.ScheduleTriggerParamMapper"</span> <span style="color: #0000ff;">></span>
  4. <span style="color: #0000ff;"><</span><span style="color: #800000;">resultMap </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="BaseResultMap"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="com.hmc.quartz02.model.ScheduleTriggerParam"</span> <span style="color: #0000ff;">></span>
  5. <span style="color: #0000ff;"><</span><span style="color: #800000;">constructor </span><span style="color: #0000ff;">></span>
  6. <span style="color: #0000ff;"><</span><span style="color: #800000;">idArg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="param_id"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="INTEGER"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.Integer"</span> <span style="color: #0000ff;">/></span>
  7. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="VARCHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  8. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="value"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="VARCHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  9. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="schedule_trigger_id"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="INTEGER"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.Integer"</span> <span style="color: #0000ff;">/></span>
  10. <span style="color: #0000ff;"></</span><span style="color: #800000;">constructor</span><span style="color: #0000ff;">></span>
  11. <span style="color: #0000ff;"></</span><span style="color: #800000;">resultMap</span><span style="color: #0000ff;">></span>
  12. <span style="color: #0000ff;"><</span><span style="color: #800000;">sql </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="Base_Column_List"</span> <span style="color: #0000ff;">></span><span style="color: #000000;">
  13. param_id, name, value, schedule_trigger_id
  14. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">sql</span><span style="color: #0000ff;">></span>
  15. <span style="color: #0000ff;"><</span><span style="color: #800000;">select </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="queryScheduleParams"</span><span style="color: #ff0000;"> resultType</span><span style="color: #0000ff;">="com.hmc.quartz02.model.ScheduleTriggerParam"</span><span style="color: #0000ff;">></span><span style="color: #000000;">
  16. SELECT
  17. </span><span style="color: #0000ff;"><</span><span style="color: #800000;">include </span><span style="color: #ff0000;">refid</span><span style="color: #0000ff;">="Base_Column_List"</span><span style="color: #0000ff;">/></span><span style="color: #000000;">
  18. FROM t_schedule_trigger_param where
  19. schedule_trigger_id=#{id}
  20. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">select</span><span style="color: #0000ff;">></span>
  21. <span style="color: #0000ff;"></</span><span style="color: #800000;">mapper</span><span style="color: #0000ff;">></span>

ScheduleTtriggerMapper

  1. <span style="color: #000000;">package com.hmc.quartz02.mapper;
  2. import com.hmc.quartz02.model.ScheduleTtrigger;
  3. import org.springframework.stereotype.Repository;
  4. import java.util.List;
  5. @Repository
  6. public interface ScheduleTtriggerMapper {
  7. /**
  8. * 获取所有的定时调度任务信息t_schedule_trigger
  9. */
  10. List</span><span style="color: #0000ff;"><</span><span style="color: #800000;">ScheduleTtrigger</span><span style="color: #0000ff;">></span><span style="color: #000000;"> queryScheduleTtrigger();
  11. }</span>

ScheduleTtriggerMapper.xml

  1. <span style="color: #0000ff;"><?</span><span style="color: #ff00ff;">xml version="1.0" encoding="UTF-8" </span><span style="color: #0000ff;">?></span>
  2. <span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" </span><span style="color: #0000ff;">></span>
  3. <span style="color: #0000ff;"><</span><span style="color: #800000;">mapper </span><span style="color: #ff0000;">namespace</span><span style="color: #0000ff;">="com.hmc.quartz02.mapper.ScheduleTtriggerMapper"</span> <span style="color: #0000ff;">></span>
  4. <span style="color: #0000ff;"><</span><span style="color: #800000;">resultMap </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="BaseResultMap"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="com.hmc.quartz02.model.ScheduleTtrigger"</span> <span style="color: #0000ff;">></span>
  5. <span style="color: #0000ff;"><</span><span style="color: #800000;">constructor </span><span style="color: #0000ff;">></span>
  6. <span style="color: #0000ff;"><</span><span style="color: #800000;">idArg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="INTEGER"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.Integer"</span> <span style="color: #0000ff;">/></span>
  7. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="cron"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="VARCHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  8. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="status"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="CHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  9. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="job_name"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="VARCHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  10. <span style="color: #0000ff;"><</span><span style="color: #800000;">arg </span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="job_group"</span><span style="color: #ff0000;"> jdbcType</span><span style="color: #0000ff;">="VARCHAR"</span><span style="color: #ff0000;"> javaType</span><span style="color: #0000ff;">="java.lang.String"</span> <span style="color: #0000ff;">/></span>
  11. <span style="color: #0000ff;"></</span><span style="color: #800000;">constructor</span><span style="color: #0000ff;">></span>
  12. <span style="color: #0000ff;"></</span><span style="color: #800000;">resultMap</span><span style="color: #0000ff;">></span>
  13. <span style="color: #0000ff;"><</span><span style="color: #800000;">sql </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="Base_Column_List"</span> <span style="color: #0000ff;">></span><span style="color: #000000;">
  14. id, cron, status, job_name, job_group
  15. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">sql</span><span style="color: #0000ff;">></span>
  16. <span style="color: #0000ff;"><</span><span style="color: #800000;">select </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="queryScheduleTtrigger"</span><span style="color: #ff0000;"> resultType</span><span style="color: #0000ff;">="com.hmc.quartz02.model.ScheduleTtrigger"</span><span style="color: #0000ff;">></span><span style="color: #000000;">
  17. SELECT
  18. </span><span style="color: #0000ff;"><</span><span style="color: #800000;">include </span><span style="color: #ff0000;">refid</span><span style="color: #0000ff;">="Base_Column_List"</span><span style="color: #0000ff;">/></span><span style="color: #000000;">
  19. FROM t_schedule_trigger
  20. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">select</span><span style="color: #0000ff;">></span>
  21. <span style="color: #0000ff;"></</span><span style="color: #800000;">mapper</span><span style="color: #0000ff;">></span>

定时任务作业类

  1. <span style="font-size: 14pt;">IScheduleTriggerParamServiceImp<br></span>
  1. <span style="color: #000000;">package com.hmc.quartz02.service.impl;
  2. import com.hmc.quartz02.mapper.ScheduleTriggerParamMapper;
  3. import com.hmc.quartz02.mapper.ScheduleTtriggerMapper;
  4. import com.hmc.quartz02.model.ScheduleTriggerParam;
  5. import com.hmc.quartz02.model.ScheduleTtrigger;
  6. import com.hmc.quartz02.service.IScheduleTriggerParamService;
  7. import org.quartz.*;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.scheduling.annotation.Scheduled;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.stereotype.Service;
  12. import java.util.List;
  13. /**
  14. * @author胡明财
  15. * @site www.xiaomage.com
  16. * @company xxx公司
  17. * @create  2019-11-30 02:39
  18. */
  19. @Service
  20. public class IScheduleTriggerParamServiceImpl {
  21. //获取调度器实例
  22. @Autowired
  23. private Scheduler scheduler;
  24. @Autowired
  25. private ScheduleTtriggerMapper sheduleTtriggerMapper;
  26. @Autowired
  27. private ScheduleTriggerParamMapper scheduleTriggerParamMapper;
  28. @Scheduled(cron = "*/10 * * * * ?")
  29. public void reflushScheduler(){
  30. try {
  31. //1.循环获取数据库里面的所有定时任务信息
  32. List</span><span style="color: #0000ff;"><</span><span style="color: #800000;">ScheduleTtrigger</span><span style="color: #0000ff;">></span><span style="color: #000000;"> list = sheduleTtriggerMapper.queryScheduleTtrigger();
  33. //2.循环遍历
  34. for (ScheduleTtrigger scheduleTtrigger : list) {
  35. //获取cron表达式
  36. String cron=scheduleTtrigger.getCron();
  37. //获取Jobname,job任务类的全路径名
  38. String jobname=scheduleTtrigger.getJobName();
  39. //获取JobGroup
  40. String jobGroup=scheduleTtrigger.getJobGroup();
  41. //获取Status运行状态
  42. String status=scheduleTtrigger.getStatus();
  43. //3.根据Jobname和JobGroup生成TriggerKey
  44. TriggerKey triggerKey = TriggerKey.triggerKey(jobname, jobGroup);
  45. //4根据TriggerKey获取Scheduler调度器中的触发器,并判断是否为null,不为null即存在
  46. CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey);
  47. //5判断是否为null
  48. if(null==trigger){
  49. //6.判断当前kob任务是否可用
  50. if(status.equals("0"))
  51. continue;
  52. //7.创建JobDetail
  53. JobDetail jobDetail = JobBuilder.newJob((Class</span><span style="color: #0000ff;"><?</span><span style="color: #ff00ff;"> extends Job>) Class.forName(jobname))
  54. .withIdentity(jobname,jobGroup)
  55. .build();
  56. //8.传递参数到job任中
  57. JobDataMap jobDataMap=jobDetail.getJobDataMap();
  58. //获取调度器任务id
  59. Integer scheduleid=scheduleTtrigger.getId();
  60. List<ScheduleTriggerParam> params = scheduleTriggerParamMapper.queryScheduleParams(scheduleid);
  61. for (ScheduleTriggerParam param : params) {
  62. jobDataMap.put(param.getName(),param.getValue());
  63. }
  64. //9.创建cron表达式调度器
  65. CronScheduleBuilder cronScheduleBuilder =
  66. CronScheduleBuilder.cronSchedule(cron);
  67. //10 创建cron表达式触发器
  68. trigger=TriggerBuilder.newTrigger()
  69. .withIdentity(jobname,jobGroup)
  70. .withSchedule(cronScheduleBuilder)
  71. .build();
  72. //11.将jobDetail和Trigger注入到调度器中
  73. scheduler.scheduleJob(jobDetail,trigger);
  74. }
  75. else{
  76. System.out.println("Quartz调度器实例已经存在");
  77. if(status.equals("0")){
  78. //删除调度任务
  79. JobKey jobKey=JobKey.jobKey(jobname,jobGroup);
  80. scheduler.deleteJob(jobKey);
  81. continue;
  82. }
  83. //获取调度器中的表达式
  84. String cronExpression = trigger.getCronExpression();
  85. //将调度器中的cron与数据库中的job任务进行比对
  86. if(!cron.equals(cronExpression)){
  87. //重构表达式调度器
  88. CronScheduleBuilder newCronSchedule = CronScheduleBuilder.cronSchedule(cron);
  89. //重构CronTrigger
  90. trigger=TriggerBuilder.newTrigger()
  91. .withIdentity(triggerKey)
  92. .withSchedule(newCronSchedule)
  93. .build();
  94. //刷新调度器实例
  95. scheduler.rescheduleJob(triggerKey,trigger);
  96. }
  97. }
  98. }
  99. } catch (Exception e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. }</span>

读取数据库中表达式启动定时任务

技术图片

 

 

  1. <span style="font-size: 14pt;">1表示可用,0表示不可用<br><br></span>
  1. <strong><span style="font-size: 14pt;">MyJob1任务 测试<br></span></strong>
  1. <span style="color: #000000;">package com.hmc.quartz02.quartz;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. import org.springframework.stereotype.Component;
  7. import java.util.Date;
  8. /**
  9. * @author胡明财
  10. * @site www.xiaomage.com
  11. * @company xxx公司
  12. * @create  2019-11-30 01:57
  13. */
  14. @Component
  15. @Slf4j
  16. public class MyJob1 implements Job{
  17. //获取spring 上下文的Bean
  18. @Override
  19. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  20. System.out.println("这是一个简单的Job任务调度实例"+ new Date().toLocaleString());
  21. }
  22. }</span>

技术图片

 

 

  1. <span style="font-size: 14pt;"><strong>MyJob2任务 测试 带参数的<br><img alt="技术图片" src="https://img.gxlcms.com//Uploads-s/new/2020-10-14-qlqqti/20191203194604672139.png"></strong></span>

 

 

  1. <span style="color: #000000;">package com.hmc.quartz02.quartz;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.quartz.*;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Date;
  6. /**
  7. * @author胡明财
  8. * @site www.xiaomage.com
  9. * @company xxx公司
  10. * @create  2019-11-30 01:57
  11. */
  12. @Component
  13. @Slf4j
  14. public class MyJob2 implements Job{
  15. //获取spring 上下文的Bean
  16. @Override
  17. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  18. System.out.println("这是一个有参数的Job任务调度实例,用于接收外部参数"+new Date().toLocaleString());
  19. JobDetail jobDetail=jobExecutionContext.getJobDetail();
  20. JobDataMap jobDataMap=jobDetail.getJobDataMap();
  21. System.out.println("name="+jobDataMap.get("name")+",age="+jobDataMap.get("age")
  22. );
  23. }
  24. }</span>

 

  1. <span style="font-size: 14pt;"><strong><br><img alt="技术图片" src="https://img.gxlcms.com//Uploads-s/new/2020-10-14-qlqqti/20191203194604883063.png"></strong></span>

 

 

 

  1. <span style="font-size: 14pt;"><strong>MyJob3任务 测试 </strong></span>
  1. <span style="font-size: 14pt;"><strong> </strong></span>
  1. <span style="color: #000000;">package com.hmc.quartz02.quartz;
  2. import com.hmc.quartz02.model.ScheduleTriggerParam;
  3. import com.hmc.quartz02.service.IScheduleTriggerParamService;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.quartz.*;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Component;
  8. import java.util.Date;
  9. import java.util.List;
  10. /**
  11. * @author胡明财
  12. * @site www.xiaomage.com
  13. * @company xxx公司
  14. * @create  2019-11-30 01:57
  15. */
  16. @Component
  17. @Slf4j
  18. public class MyJob3 implements Job{
  19. @Autowired
  20. private IScheduleTriggerParamService IScheduleTriggerParamService;
  21. //获取spring 上下文的Bean
  22. @Override
  23. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  24. System.out.println("这是一个获取sprig中Bean的job任务"+new Date().toLocaleString());
  25. List</span><span style="color: #0000ff;"><</span><span style="color: #800000;">ScheduleTriggerParam</span><span style="color: #0000ff;">></span><span style="color: #000000;"> scheduleTriggerParams =
  26. IScheduleTriggerParamService.queryScheduleParams(2);
  27. System.out.println("参数数量"+scheduleTriggerParams.size());
  28. }
  29. }</span>

技术图片

 

 

Springbot 结合Vue实现页面版

  1. <span style="font-size: 14pt;">这里需要配置跨越<br></span>
  1. <span style="font-size: 14pt;">@CrossOrigin(origins = {"*","null"}) 放在类上面即可<br><img alt="技术图片" src="https://img.gxlcms.com//Uploads-s/new/2020-10-14-qlqqti/20191203194605148671.png"></span>

 

 

  1. <span style="font-size: 14pt;"> 效果图<br><img alt="技术图片" src="https://img.gxlcms.com//Uploads-s/new/2020-10-14-qlqqti/20191203194605248274.png"></span>

 

 quartz.vue

  1. <span style="color: #0000ff;"><</span><span style="color: #800000;">template</span><span style="color: #0000ff;">></span>
  2. <span style="color: #0000ff;"><</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  3. <span style="color: #008000;"><!--</span><span style="color: #008000;"> 搜索筛选 </span><span style="color: #008000;">--></span>
  4. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">style</span><span style="color: #0000ff;">="margin-left: 30px;margin-top: 20px;"</span><span style="color: #0000ff;">></span>
  5. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-form </span><span style="color: #ff0000;">:inline</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"> :model</span><span style="color: #0000ff;">="formInline"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="user-search"</span><span style="color: #0000ff;">></span>
  6. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-form-item </span><span style="color: #ff0000;">label</span><span style="color: #0000ff;">="搜索:"</span><span style="color: #0000ff;">></span>
  7. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-input </span><span style="color: #ff0000;">size</span><span style="color: #0000ff;">="small"</span><span style="color: #ff0000;"> v-model</span><span style="color: #0000ff;">="formInline.uname"</span><span style="color: #ff0000;"> placeholder</span><span style="color: #0000ff;">="输入用户名称"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">el-input</span><span style="color: #0000ff;">></span>
  8. <span style="color: #0000ff;"></</span><span style="color: #800000;">el-form-item</span><span style="color: #0000ff;">></span>
  9. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-form-item</span><span style="color: #0000ff;">></span>
  10. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-button </span><span style="color: #ff0000;">size</span><span style="color: #0000ff;">="small"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="primary"</span><span style="color: #ff0000;"> icon</span><span style="color: #0000ff;">="el-icon-search"</span><span style="color: #ff0000;"> @click</span><span style="color: #0000ff;">="douser(formInline.uname)"</span><span style="color: #0000ff;">></span>搜索<span style="color: #0000ff;"></</span><span style="color: #800000;">el-button</span><span style="color: #0000ff;">></span>
  11. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-button </span><span style="color: #ff0000;">size</span><span style="color: #0000ff;">="small"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="primary"</span><span style="color: #ff0000;"> icon</span><span style="color: #0000ff;">="el-icon-plus"</span><span style="color: #ff0000;"> @click</span><span style="color: #0000ff;">="userAdd()"</span><span style="color: #0000ff;">></span>添加<span style="color: #0000ff;"></</span><span style="color: #800000;">el-button</span><span style="color: #0000ff;">></span>
  12. <span style="color: #0000ff;"></</span><span style="color: #800000;">el-form-item</span><span style="color: #0000ff;">></span>
  13. <span style="color: #0000ff;"></</span><span style="color: #800000;">el-form</span><span style="color: #0000ff;">></span>
  14. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  15. <span style="color: #0000ff;"><</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  16. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-table </span><span style="color: #ff0000;">size</span><span style="color: #0000ff;">="small"</span><span style="color: #ff0000;"> :data</span><span style="color: #0000ff;">="listData"</span><span style="color: #ff0000;"> border element-loading-text</span><span style="color: #0000ff;">="拼命加载中"</span><span style="color: #ff0000;"> style</span><span style="color: #0000ff;">="width: 100%;"</span><span style="color: #0000ff;">></span>
  17. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-table-column </span><span style="color: #ff0000;">sortable prop</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"> align</span><span style="color: #0000ff;">="center"</span><span style="color: #ff0000;"> label</span><span style="color: #0000ff;">="任务id"</span><span style="color: #ff0000;"> min-width</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">></span>
  18. <span style="color: #0000ff;"></</span><span style="color: #800000;">el-table-column</span><span style="color: #0000ff;">></span>
  19. <span style="color: #0000ff;"><</span><span style="color: #800000;">el-table-column </span><span style="color: #ff0000;">sortable prop</span><span style="color: #0000ff;">="cron"</span><span style="color: #ff0000;"> label</span><span style="color: #0000ff;">="任务表达式"</span><span style="color: #ff0000;"> min-width</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">></span>
  20. <span style="color: #0000ff;"></</span><span style="color: #800000;">el-table-column</span><span style="color: #0000ff;">></span>

人气教程排行