最近做了一个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; }