zoukankan      html  css  js  c++  java
  • spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

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

    1. 在项目中引入jar

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

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

     3. java 代码

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

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

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

     

    要注入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;
        }
  • 相关阅读:
    15.Linux的文件结构
    14.管道模型
    13.ubuntu下Qt5无法使用中文的问题解决
    12.时钟与信号
    11.进程控制
    10.设备文件
    [GXOI/GZOI2019]旅行者
    [GXOI/GZOI2019]旧词
    [BJOI2019] 删数
    [BJOI2019] 光线
  • 原文地址:https://www.cnblogs.com/weiqinshian/p/6759106.html
Copyright © 2011-2022 走看看