构建maven项目,引入maven依赖包

其中quartz、quartz-jobs、spring-boot-starter-quartz、spring-context-support  四个依赖包为quartz定时任务所需

<?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.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>cronjob</artifactId><version>0.0.1-SNAPSHOT</version><name>cronjob</name><description>cronjob project for Spring Boot</description><!--自定义属性值 一般自定义依赖包的版本号与指定项目字符编码--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR3</spring-cloud.version><spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version><quartz.version>2.3.2</quartz.version></properties><dependencies><!--引入其他服务的api模块--><dependency><groupId>com.springcloud</groupId><artifactId>dubbo_api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>${quartz.version}</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>${quartz.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><!--管理spring-cloud-alibaba相关依赖包的版本--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

quartz的核心job的创建是由Quartz通过反射创建的,并未交由Spring容器创建。故原则上来说,是无法在Job实例中使用依赖注入

package com.example.cronjob.config;import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;/*** @author Administrator* @description Job的创建是由Quartz通过反射创建的* 并未交由Spring容器创建。故原则上来说,是无法在Job实例中使用依赖注入* @date 2021-03-22 10:54*/
@Component
@EnableScheduling
public class JobFactory extends AdaptableJobFactory {@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {Object jobInstance = super.createJobInstance(bundle);// 使用AutowireCapableBeanFactory完成对IOC外Bean的注入操作capableBeanFactory.autowireBean(jobInstance);return jobInstance;}
}

调度器Scheduler的创建,用于对定时任务的各项操作

package com.example.cronjob.config;import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;import java.io.IOException;/*** @author Administrator* @description* @date 2021-03-22 10:54*/
@Configuration
public class QuartzConfig {@Autowiredprivate JobFactory jobFactory;@Bean(name = "schedulerFactory")public SchedulerFactoryBean schedulerFactoryBean() throws IOException {SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();// 设置自行启动//schedulerFactoryBean.setAutoStartup(false);schedulerFactoryBean.setJobFactory(jobFactory);schedulerFactoryBean.setOverwriteExistingJobs(true);// 延时启动schedulerFactoryBean.setStartupDelay(1);return schedulerFactoryBean;}@Bean(name = "scheduler")public Scheduler scheduler() throws IOException {return schedulerFactoryBean().getScheduler();}
}

对应yml配置的实体类,用于匹配配置文件信息做定时任务启动

package com.example.cronjob.entity;import lombok.Data;import java.io.Serializable;/*** @author Administrator* @description* @date 2021-03-22 14:01*/
@Data
public class JobEntity implements Serializable {private static final long serialVersionUID = 6602540505183675348L;private String jobName;private String jobGroup;private String jobClassName;private String cronExpression;private int triggerState;private int sort;
}

创建一个枚举类判断任务状态

package com.example.cronjob.common;/*** @author Administrator* @description* @date 2021-03-22 14:34*/
public enum QuartzEnum {NORMAL(1, "正常"),PAUSED(0, "暂停");private int code;private String name;QuartzEnum(int code, String name) {this.code = code;this.name = name;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

使用预加载方式,在项目启动成功之后读取quartz.yml配置文件信息,并且把定时任务加入调度器管理

package com.example.cronjob.config;import com.example.cronjob.common.QuartzEnum;
import com.example.cronjob.entity.JobEntity;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Administrator* @description* @date 2021-03-22 14:15*/
@Component
@ConfigurationProperties(prefix = "quartz")
public class ScheduleJobListenerStart implements ApplicationRunner {@Autowired@Qualifier("scheduler")private Scheduler scheduler;List<JobEntity> jobs = new ArrayList<>();@Overridepublic void run(ApplicationArguments args) throws Exception {for(JobEntity entity : jobs) {// 当定时任务状态为0时,不启动if (entity.getTriggerState() == QuartzEnum.PAUSED.getCode()) {continue;}// 创建jobDetail实例,绑定Job实现类// 指明job的名称,所在组的名称,以及绑定job类Class<? extends Job> jobClass = (Class<? extends Job>) (Class.forName(entity.getJobClassName()).newInstance().getClass());JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(entity.getJobName(), entity.getJobGroup()).build();CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(entity.getCronExpression());CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(entity.getJobName(), entity.getJobGroup()).withSchedule(scheduleBuilder).build();Map<String, Object> map = new HashMap<>();map.put("sort", entity.getSort());if (map != null) {trigger.getJobDataMap().putAll(map);}scheduler.scheduleJob(jobDetail, trigger);}}public List<JobEntity> getJobs() {return jobs;}public void setJobs(List<JobEntity> jobs) {this.jobs = jobs;}
}

项目application.yml配置文件信息

spring:profiles:active: testinclude: quartzapplication:name: cron-job

本地测试application-test.yml配置文件

server:port: 8085
dubbo:protocol:name: dubboport: -1registry:address: spring-cloud://192.168.3.192check: falsecloud:# 订阅服务提供者, 要订阅多个服务,请使用,(英文逗号)作为分隔符subscribed-services: dubbo-provider# 解决Dubbo中生产者未启动, 使用@Reference实例化的对象都是null# 消费者启动报错的问题, 很多时候服务是提供者也是消费者# 启动时检查提供者是否存在,true报错,false忽略  默认值truecheck: false# 远程服务调用超时时间(毫秒), 默认值1000timeout: 20000
spring:# 是否开启AOP面向切面aop:auto: truecloud:nacos:discovery:# nacos集群方式就是把所有数据持久化到mysql数据库# 多个注册中心配置ip1:port1,ip2:port2,ip3:port3server-addr: 192.168.3.192:8848
org:quartz:threadPool:class: org.quartz.simpl.SimpleThreadPoolthreadCount: 100threadPriority: 5threadsInheritContextClassLoaderOfInitializingThread: true

quartz定时任务列表application-quartz.yml配置文件

quartz:# jobGroup名称一致的情况下,不可出现相同jobNamejobs[0]:jobName: 本地定时任务# 以服务名为组名jobGroup: localhost# 业务逻辑处理类的包名jobClassName: com.example.cronjob.task.LocalhostTask# cron表达式 每30秒执行一次cronExpression: 0/30 * * * * ?# 任务状态 1 正常 0 暂停triggerState: 1# 排序sort: 1jobs[1]:jobName: 用户服务-同步员工信息# 以服务名为组名jobGroup: dubbo-provider# 业务逻辑处理类的包名jobClassName: com.example.cronjob.task.UserSyncTask# cron表达式 每5分钟执行一次cronExpression: 0 0/5 * * * ? *# 任务状态 1 正常 0 暂停triggerState: 1sort: 2

测试本地设置一个定时任务每30秒执行一次

package com.example.cronjob.task;import org.quartz.*;import java.io.Serializable;/*** @author Administrator* @description* @date 2021-03-22 16:26*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class LocalhostTask implements Job, Serializable {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("=========本地执行定时任务=========");}
}

调用其他微服务,每5分钟执行一次

package com.example.cronjob.task;import com.springcloud.dubbo_api.service.HelloServiceApi;
import org.apache.dubbo.config.annotation.Reference;
import org.quartz.*;import java.io.Serializable;
import java.util.Date;/*** @author Administrator* @description* @date 2021-03-22 14:57*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class UserSyncTask implements Job, Serializable {@Referenceprivate HelloServiceApi helloServiceApi;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("=========同步员工信息=========" + new Date());try {helloServiceApi.hello("cron_job");} catch (Exception e) {JobExecutionException ex = new JobExecutionException(e);// true 表示立即重新执行该任务, 不断重试,直到成功,项目中不能确定其他服务中断的时间有多长,不建议设置该参数// 微服务中,比如当前为A服务,调用B服务的接口,而B服务中断重启,当B服务重启成功并且调用接口成功后退出该异常循环,类似心跳机制//ex.setRefireImmediately(true);// true 表示 Quartz 会自动取消所有与这个 job 有关的 trigger,从而避免再次运行 job// 当某个服务中断或重启时,手动恢复指定的任务// 也可以单独设定一个定时任务获取已停止的任务进行恢复ex.setUnscheduleAllTriggers(true);throw ex;}}
}

如果需要对定时任务的暂停、恢复等操作,查看另一个文章

https://blog.csdn.net/m0_37845840/article/details/114934611?spm=1001.2014.3001.5501

Springboot集成Quartz定时任务yml文件配置方式相关推荐

  1. Springboot集成quartz定时任务可视化配置​​​​​​​

    转自我的个人博客:Springboot集成quartz定时任务可视化配置 使用quartz定时任务已经有一段时间了,今天记录一下Springboot 2.x集成Quartz. 1.引入quartz j ...

  2. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  3. yml配置oracle连接,springboot yml 文件配置oracle,提示账号密码错误

    最近使用Spring boot,本来一直连接的是mysql数据库,一直没问题.昨天在更换了oracle数据库后,一直提示账号密码不正确,登录被拒绝.检查多次,检查账号密码一切正常,但就是连接不上ora ...

  4. SpringBoot集成Quartz(定时任务)

    SpringBoot集成Quartz(定时任务)_鱼找水需要时间的博客-CSDN博客_springboot集成quartz

  5. SpringBoot集成quartz定时调度任务并通过JDBC持久化

    SpringBoot集成quartz定时调度任务并通过JDBC持久化 话不多说上干货 项目pom依赖 配置类 抽象出调度任务实体类 调度执行和调度任务更改工具类 调度配置与执行的代码完毕,下面就是对持 ...

  6. SpringBoot集成Quartz框架

    SpringBoot集成Quartz框架 (一)集成环境: ​ Win10系统 ​ JDK版本:11.0.13 ​ SpringBoot版本:2.3.4.RELEASE ​ Quartz版本:2.3. ...

  7. Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化

    Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化 7大服务与核心表 23张表概览 7大核心服务(重要) 加依赖 内部 ...

  8. SpringBoot - 集成Quartz框架:Couldn‘t acquire next trigger: Couldn‘t retrieve trigger: 不良的类型值 long : \x

    写在前面 SpringBoot 集成Quartz框架时,数据保存方式使用PostgreSQL进行数据库持久化. 报错如下: Couldn't acquire next trigger: Couldn' ...

  9. SpringBoot集成163邮件发送详细配置,从163邮箱开始配置

    SpringBoot集成163邮件发送详细配置,从163邮箱开始配置 1.登录163邮箱 2.配置163邮箱 3.开始编写SpringBoot代码 1.创建SpringBoot项目然后引入依赖 2.编 ...

最新文章

  1. 【Nginx】如何建立新连接
  2. oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚?
  3. 青少年蓝桥杯_2020_steam考试_中级组_第三题
  4. 饿了么EMonitor演进史
  5. Mac下的Parallel Windows忘记密码怎么办?
  6. Java:实验四第5题
  7. Android开发系列(十七):读取assets文件夹下的数据库文件
  8. MyCat的安装及基本使用(MySQL分库分表)
  9. IPsec简单实验-IKE协商
  10. OV426+OVM6946基于FPGA调试成像
  11. 谁为乔布斯写下「致敬疯子」的广告词
  12. 周记——20150907
  13. Redis桌面管理器下载
  14. 如何查看MySQL的表空间
  15. SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
  16. 飞腾arm服务器下的银河麒麟V10 yum 安装docker
  17. 实现Fegin远程调用
  18. 【操作系统基础】文件管理系统(一)
  19. OpenGL集锦(1)-安装与概述
  20. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕!

热门文章

  1. 三天学会Mysql之第(三)天:创建修改删除
  2. 网络篇 默认网关-14
  3. 一款高仿 Eyepetizer | 开眼短视频的 MVVM 开源项目
  4. python安装错80072ee2_更新Win10系统出现0x80072ee2错误的解决方法
  5. ecshop 二次开发基本思想 授之以鱼,不如授人以渔
  6. 【闲谈】第一份实习(上)
  7. 女友想让我带她吃大闸蟹,我用Python做了一个最全吃蟹攻略!拿去用吧!
  8. lucene php,用PHP调用Lucene包来实现全文检索_php
  9. 烤仔说· ConDragon | 什么?烤仔居然是个龙骑士?
  10. 【NLG】(二)文本生成评价指标—— METEOR原理及代码示例