spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

时间:2022-05-23 21:41:04

最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务。能够对定时任务,动态的进行增删改查,界面效果图如下:

 

spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

 

 

1. 在项目中引入jar

spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

 

2. 将需要的表导入数据库

 官网上有不同数据库的脚本,找到对应的,导入即可

spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

 

 

 3. java 代码

 

将quartz 的相关配置文件,配置为暴露bean,方便后期引用。

有一处关键的地方,就是注入spring 上下文,这是一个坑。

如果,不注入spring 上下文,那么新添加的定时任务job,是新new 的一个线程,和spring没有任何关系,在job 中也调用不了spring 注入的service方法。

 spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

 

要注入spring上下文,必须通过该方式,实例化job

 

@Configuration
public class DruidDBConfig { @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); }

 

 

4. 配置在集群环境中运行

isClustered 属性设置为true ,相当于告诉quartz,当前处于集群环境。

  /**
     * 设置quartz属性
     * 
     * @author XW
     * @create_date 2016年12月28日
     * @return Properties
     */

    public Properties quartzProperties() {
        Properties prop = new Properties();

        // org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore
        // 中来唯一标识实例,但是所有集群节点中必须相同。
        prop.put("quartz.scheduler.instanceName", "ServerScheduler");
        // instanceId 属性为 AUTO即可,基于主机名和时间戳来产生实例 ID。
        prop.put("org.quartz.scheduler.instanceId", "AUTO");

        //
        // Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本。这个检查是异步的,不影响Quartz项目本身的启动和初始化。
        // 设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更新检查
        prop.put("org.quartz.scheduler.skipUpdateCheck", "false");

        //
        prop.put("org.quartz.scheduler.jobFactory.class", "org.quartz.simpl.SimpleJobFactory");

        // org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播
        // Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。
        // 这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
        prop.put("org.quartz.jobStore.dataSource", "quartzDataSource");
        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
        // isClustered属性为 true,你就告诉了Scheduler实例要它参与到一个集群当中。这一属性会贯穿于调度框架的始终
        prop.put("org.quartz.jobStore.isClustered", "true");

        //
        // clusterCheckinInterval属性定义了Scheduler实例检入到数据库中的频率(单位:毫秒)。Scheduler查是否其他的实例到了它们应当检入的时候未检入;
        // 这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。
        // 通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval 越小,Scheduler
        // 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)
        prop.put("org.quartz.jobStore.clusterCheckinInterval", "60000");
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "5");
        prop.put("org.quartz.dataSource.quartzDataSource.driver", "com.mysql.jdbc.Driver");
        prop.put("org.quartz.dataSource.quartzDataSource.URL", datasourceurl);
        prop.put("org.quartz.dataSource.quartzDataSource.user", username);
        prop.put("org.quartz.dataSource.quartzDataSource.password", password);
        prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", "10");
        return prop;
    }