如何实现动态可配置定时任务?太简单了!

作者:微信小助手

发布时间:2020-04-08T08:39:19

定时任务简述

定时任务,在企业开发中尤其重要,很多业务都是需要定时任务去做的。比如说10点开售某件东西,凌晨0点统计注册人数,统计其他各种等等。这个时候不可能说让人为的去开启某个开关或者怎么怎么样的,如果这样的话,估计都要崩溃了。今天给大家介绍如何在项目中使用Quartz并且在后台动态配置定时任务的启动,暂停,重启,停止,还有修改启动的时间,修改执行的任务等。

引入依赖的jar包

        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-quartz</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>1.3.2</version>        </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>

application.yml的配置

quartz:    scheduler:      instance-name: MyselfScheduler      instance-id: NON_CLUSTERED # 使用集群:AUTO 不使用集群:NON_CLUSTERED      skip-update-check: true      job-factory:        class: org.quartz.simpl.SimpleJobFactory    job-store:      class: org.quartz.impl.jdbcjobstore.JobStoreTX      driver-delegate-class: org.quartz.impl.jdbcjobstore.StdJDBCDelegate      datasource: quartzDataSource      table-prefix: QRTZ_      is-clustered: true    thread-pool:      class: org.quartz.simpl.SimpleThreadPool      thread-count: 5    datasource:      quartzDataSource:        driver: ${spring.datasource.druid.driver-class-name}        url: ${spring.datasource.druid.url}        user: ${spring.datasource.druid.username}        password: ${spring.datasource.druid.password}        maxConnections: 5        validationQuery: select 0        connection-provider:          class: com.lingdu.welend.config.quartz.DruidConnectionProvider

扩展druid数据源作为quartz的数据源

import com.alibaba.druid.pool.DruidDataSource;import org.quartz.SchedulerException;import org.quartz.utils.ConnectionProvider;
import java.sql.Connection;import java.sql.SQLException;
/** * @author Lee * @// TODO 2018/6/1-16:37 * @description Druid连接池的Quartz扩展类 */

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 maxConnections; //数据库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.maxConnections < 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.maxConnections); datasource.setMinIdle(1); datasource.setMaxWait(0); datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS); 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 getMaxConnections() { return maxConnections; }
public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; }
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 idleConnectionValidationSeco