建设部执业资格注册中心网站查询,小程序公司十大排名,稳定的网站制作需要多少钱,国外超酷设计网站文章目录 前言一、quartz是什么#xff1f;二、quartz中核心概念三、集成步骤1.引入依赖2.demo样例a.定义一个任务参数实体类b.定义操作触发器、定时任务接口及实现c.作业实现d.结果截图 四、其他1.QuartzJobBean和Job区别2.注意事项3.作业#xff08;Job#xff09;和触发器… 文章目录 前言一、quartz是什么二、quartz中核心概念三、集成步骤1.引入依赖2.demo样例a.定义一个任务参数实体类b.定义操作触发器、定时任务接口及实现c.作业实现d.结果截图  四、其他1.QuartzJobBean和Job区别2.注意事项3.作业Job和触发器Trigger参数解析a.JobDetail 参数解析a.Trigger 参数解析    前言 
项目中可能会遇到一些需要定时同步数据的业务场景比如从多个数据库汇总数据形成结果可以使用数据自带的定时任务去执行存储过程实现也可以通过集成quartz来实现 一、quartz是什么 
1、Quartz是一个功能强大且灵活的开源任务调度库用于在Java应用程序中实现定时任务和作业调度。它允许你根据特定的时间表比如每天凌晨执行一次或者每隔一段时间执行一次来调度任务的执行。Quartz提供了丰富的功能包括支持CRON表达式、作业持久化、集群环境下的分布式调度、监听器支持等。 2、通过Quartz可以创建各种类型的作业例如简单作业只需要执行一次、重复作业按照指定的时间间隔重复执行、以及基于CRON表达式的作业按照指定的时间规则执行。 
二、quartz中核心概念 
1、任务 Job Job 就是你想要实现的任务类每一个 Job 必须实现org.quartz.job 接口且只需实现接口定义的execute() 方法。 2、触发器 Trigger Trigger 为你执行任务的触发器Trigger将会设置3点执行该任务。 Trigger主要包含两种 SimplerTrigger 和 CronTrigger 两种。 3、调度器 Scheduler Scheduler 为任务的调度器它会将任务 Job 及触发器 Trigger 整合起来负责基于Trigger 设定的时间来执行 Job。 
三、集成步骤 
1.引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactIdversion2.6.13/version/dependency2.demo样例 
a.定义一个任务参数实体类 
Data
public class QuartzJobInfo {private String type;private MapString, Object params;private String jobName;private String cronj;private String orderId;
}b.定义操作触发器、定时任务接口及实现 
接口类 
public interface IQuartzService {//1.添加定时任务void addTrigger(QuartzJobInfo jobInfo);//2.移除定时任务idvoid delTrigger(Long id);}接口实现类 
Service
public class QuartzServiceImpl implements IQuartzService {Autowiredprivate SchedulerFactoryBean factoryBean;Overridepublic void addTrigger(QuartzJobInfo jobInfo) {//jobInfo转换为jsonString info  JSONObject.toJSONString(jobInfo);//获取调度器Scheduler scheduler  factoryBean.getScheduler();//调用 工具类设置定时任务QuartzUtils.addJob(scheduler, jobInfo.getJobName(), OrderJob.class, info, jobInfo.getCronj());}Overridepublic void delTrigger(Long id) {//获取Job的名字String jobName  product_job  id;//获取调度器Scheduler scheduler  factoryBean.getScheduler();QuartzUtils.removeJob(scheduler, jobName);}}工具类 
/*** Quartz调度管理器*/
public class QuartzUtils {private static String JOB_GROUP_NAME  JOB_GROUP_SYSTEM;private static String TRIGGER_GROUP_NAME  TRIGGER_GROUP_SYSTEM;/*** param sched   调度器* param jobName 任务名* param cls     任务* param params  任务参数* param time    时间设置参考quartz说明文档* Description: 添加一个定时任务使用默认的任务组名触发器名触发器组名* Title: QuartzManager.java*/public static void addJob(Scheduler sched, String jobName, SuppressWarnings(rawtypes) Class cls, Object params,String time) {try {JobKey jobKey  new JobKey(jobName, JOB_GROUP_NAME);// 任务名任务组任务执行类SuppressWarnings(unchecked)JobDataMap jobDataMap  new JobDataMap();jobDataMap.put(params, params);JobDetail jobDetail  newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();TriggerKey triggerKey  new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器System.out.println(time);Trigger trigger  newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();// 触发器时间设定sched.scheduleJob(jobDetail, trigger);if (!sched.isShutdown()) {sched.start();// 启动}} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched            调度器* param jobName          任务名* param jobGroupName     任务组名* param triggerName      触发器名* param triggerGroupName 触发器组名* param jobClass         任务* param params           任务参数* param time             时间设置参考quartz说明文档* Description: 添加一个定时任务* Title: QuartzManager.java*/public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,String triggerGroupName, SuppressWarnings(rawtypes) Class jobClass, Object params, String time) {try {JobKey jobKey  new JobKey(jobName, jobGroupName);JobDataMap jobDataMap  new JobDataMap();jobDataMap.put(params, params);SuppressWarnings(unchecked)JobDetail jobDetail  newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();// 触发器TriggerKey triggerKey  new TriggerKey(triggerName, triggerGroupName);Trigger trigger  newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();sched.scheduleJob(jobDetail, trigger);} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched   调度器* param jobName* param time* Description: 修改一个任务的触发时间(使用默认的任务组名  触发器名  触发器组名)* Title: QuartzManager.java*/SuppressWarnings(rawtypes)public static void modifyJobTime(Scheduler sched, String jobName, String time) {try {TriggerKey triggerKey  new TriggerKey(jobName, TRIGGER_GROUP_NAME);CronTrigger trigger  (CronTrigger) sched.getTrigger(triggerKey);if (trigger  null) {return;}String oldTime  trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {JobKey jobKey  new JobKey(jobName, JOB_GROUP_NAME);JobDetail jobDetail  sched.getJobDetail(jobKey);Class objJobClass  jobDetail.getJobClass();Object params  jobDetail.getJobDataMap().get(params);removeJob(sched, jobName);System.out.println(修改任务  jobName);addJob(sched, jobName, objJobClass, params, time);}} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched            调度器 ** param sched            调度器* param triggerName* param triggerGroupName* param time* Description: 修改一个任务的触发时间* Title: QuartzManager.java*/public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) {try {TriggerKey triggerKey  new TriggerKey(triggerName, triggerGroupName);CronTrigger trigger  (CronTrigger) sched.getTrigger(triggerKey);if (trigger  null) {return;}String oldTime  trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {// 修改时间trigger.getTriggerBuilder().withSchedule(cronSchedule(time));// 重启触发器sched.resumeTrigger(triggerKey);}} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched   调度器* param jobName* Description: 移除一个任务(使用默认的任务组名  触发器名  触发器组名)* Title: QuartzManager.java*/public static void removeJob(Scheduler sched, String jobName) {try {TriggerKey triggerKey  new TriggerKey(jobName, TRIGGER_GROUP_NAME);sched.pauseTrigger(triggerKey);// 停止触发器sched.unscheduleJob(triggerKey);// 移除触发器JobKey jobKey  new JobKey(jobName, JOB_GROUP_NAME);sched.deleteJob(jobKey);// 删除任务} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched            调度器* param jobName* param jobGroupName* param triggerName* param triggerGroupName* Description: 移除一个任务* Title: QuartzManager.java*/public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,String triggerGroupName) {try {TriggerKey triggerKey  new TriggerKey(triggerName, triggerGroupName);sched.pauseTrigger(triggerKey);// 停止触发器sched.unscheduleJob(triggerKey);// 移除触发器JobKey jobKey  new JobKey(jobName, jobGroupName);sched.deleteJob(jobKey);// 删除任务} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched 调度器* Description:启动所有定时任务* Title: QuartzManager.java*/public static void startJobs(Scheduler sched) {try {sched.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** param sched 调度器* Description:关闭所有定时任务*/public static void shutdownJobs(Scheduler sched) {try {if (!sched.isShutdown()) {sched.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}
}c.作业实现 新增作业时需要继承QuartzJobBean类实现executeInternal方法。 Component
public class OrderJob  extends QuartzJobBean implements CommandLineRunner {AutowiredIQuartzService iQuartzService;//遵循规范Overridepublic void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {String params  (String) jobExecutionContext.getJobDetail().getJobDataMap().get(params);QuartzJobInfo info  JSONObject.parseObject(params, QuartzJobInfo.class);String type  info.getType();Date now  new Date();switch (type) {case JobTypeConsts.WAIT_PRODUCT_ORDER_PAY_CANCEL_JOB://执行逻辑1System.out.println(-----------执行逻辑1,订单ID  info.getOrderId());break;case JobTypeConsts.WAIT_USERDEPOSIT_ORDER_PAY_CANCEL_JOB://执行逻辑2System.out.println(-----------执行逻辑2,订单ID  info.getOrderId());break;case JobTypeConsts.WAIT_REFUNDUSERDEPOSIT_ORDER_PAY_CANCEL_JOB://执行逻辑3System.out.println(-----------执行逻辑3,订单ID  info.getOrderId());break;}}Overridepublic void run(String... args) throws Exception {for (int i  1; i  4; i) {QuartzJobInfo quartzJobInfo  new QuartzJobInfo();quartzJobInfo.setJobName(测试定时任务---.  i);quartzJobInfo.setCronj(0 0/1 * * * ?);quartzJobInfo.setType(String.valueOf(i));quartzJobInfo.setOrderId(String.valueOf(i));iQuartzService.addTrigger(quartzJobInfo);}}
}实现CommandLineRunner接口的作用是当项目启动时会扫描到此接口执行实现接口中的逻辑执行完run方法然后根据Quartz 的调度触发机制在适当的时间执行 execute 方法。 
d.结果截图 0 0/1 * * * ?代表每分钟执行一次  四、其他 
1.QuartzJobBean和Job区别 继承关系QuartzJobBean 是一个 Spring 定制的 Quartz 作业类是 Quartz 提供的 Job 接口的一个实现类。因此QuartzJobBean 继承自 Spring 的 QuartzJobBean 类和实现了 Quartz 的 Job 接口。  扩展性通过继承 QuartzJobBean 类您可以利用 Spring 框架提供的依赖注入和生命周期管理等功能更容易地将 Quartz 作业集成到 Spring 应用中。而直接实现 Quartz 的 Job 接口则是一种更传统的方式不具备 Spring 相关的特性。  依赖注入使用 QuartzJobBean 可以方便地利用 Spring 的依赖注入机制从 Spring 容器中获取其他 Bean并在作业中使用这些 Bean例如使用使用Autowired方式。而直接实现 Job 接口时无法直接获得 Spring 托管的 Bean需要手动从 Spring 上下文中获取。  配置方式QuartzJobBean 更适合在 Spring 应用中使用可以通过 Spring 的配置文件或注解的方式来配置和管理定时任务。而直接实现 Job 接口通常需要通过 Quartz 的配置文件或 API 来进行配置。  
2.注意事项 
调度作业在在继承QuartzJobBean类后需要加Component注解确保Spring Boot 应用程序能正确扫描到。 
3.作业Job和触发器Trigger参数解析 
a.JobDetail 参数解析 
Job Class作业类指定实现了Job接口的类该类定义了要执行的作业逻辑。Job Name作业名称作业的名称用于在调度器中标识该作业。Job Group作业组作业所属的分组用于对作业进行分类管理。Job Data Map作业数据可以传递一些作业执行时需要的数据以键值对的形式存储在JobDataMap中。 
例 JobDetail jobDetail  newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();a.Trigger 参数解析 
Trigger Name触发器名称触发器的名称用于在调度器中标识该触发器。Trigger Group触发器组触发器所属的分组用于对触发器进行分类管理。Trigger Start Time触发器开始时间指定触发器首次触发的时间点。Trigger End Time触发器结束时间可选参数指定触发器的结束时间超过该时间后触发器不再生效。Repeat Interval重复间隔时间指定触发器重复执行的间隔时间。 
例: 
//创建触发器的唯一标识 TriggerKey 对象TriggerKey triggerKey  new TriggerKey(jobName, TRIGGER_GROUP_NAME);
//withSchedule() 方法用于设置触发器的调度规则
//cronSchedule(time) 表示使用 CRON 表达式来指定触发规则
//time 是一个表示 CRON 表达式的字符串用于定义触发器的执行时间规则         Trigger trigger  newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();