Java 之任务调度框架

文章目录1、Quartz1.1 引入依赖<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.3.2</version></dependency>1.2 入门案例任务:将任务类型执行 10 次 , 每次间隔 3 秒 。

  1. 任务类,需要实现 Job 接口
package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import JAVA.text.SimpleDateFormat;import java.util.Date;/** * 功能描述: 任务 * * @author XiaoNianXin * @date 2021/12/13 20:52 */public class HelloJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// 获取当前时间,并格式化Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateSrting = format.format(date);// 业务功能模拟System.out.println("开始备份数据库,时间:" + dateSrting);}}
  1. 定时器类
package com.sugar.quartz.utils;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;/** * 功能描述: 定时器配置 * * @author XiaoNianXin * @date 2021/12/13 21:08 */public class HelloSchedulerDemo {public static void main(String[] args) throws SchedulerException {// 1、调度器 - 从工厂获取调度实例Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 2、任务实例 - 执行的任务对象JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 任务名称,组名称.build();// 3、触发器 - 控制执行次数和执行时间Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") // 同上.startNow() // 立刻启动.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).withRepeatCount(10))// 循环10次,每次间隔3s.build();// 调度器关联触发器,并启动scheduler.scheduleJob(job,trigger);scheduler.start();}}1.3 Job 与 JobDetailJob:基于反射的任务调度接口 , 所有任务类都要实现该接口 , 在接口的 execute 编写自己的业务逻辑 。
Job 生命周期:每次执行 Job , 在 execute 方法前会 创建新的 Job实例  , 调用后实例被释放 , 再被GC回收 。
JobDetail:封装 Job , 给 Job 实例提供许多属性 。
JobDetail 属性:name、group、jobClass、jobDataMap 。
1.4 JobExecutionContext下文将 JobExecutionContext 简称为 JEC
JEC :当调度器调用 Job 时 , 会将 JEC 传递给 Job 的 execute 方法 。
JEC 作用:Job 通过 JEC 获取运行环境的信息 , 以及 Job 信息 。
1.5 JobDataMap下文将 JobDataMap 简称为 JDM
JDM:任务调度时 , JDM 存储在 JEC 中 , 方便获取 。
JDM 优点:实现 Map 接口 , 可以存取任何可序列化对象 , Job 执行时会将参数传给 JDM 。
1、手动获取 JDM 参数案例
HelloSchedulerDemo:
package com.sugar.quartz.utils;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;/** * 功能描述: 定时器配置 * * @author XiaoNianXin * @date 2021/12/13 21:08 */public class HelloSchedulerDemo {public static void main(String[] args) throws SchedulerException {// 1、调度器 - 从工厂获取调度实例Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 2、任务实例 - 执行的任务对象JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 任务名称,组名称.usingJobData("msg","JDM使用 - Detail")// JDM 传递参数.build();// 3、触发器 - 控制执行次数和执行时间Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") // 同上.startNow() // 立刻启动.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).withRepeatCount(10))// 循环10次,每次间隔3s.usingJobData("msg","JDM使用 - Trigger").build();// 调度器关联触发器,并启动scheduler.scheduleJob(job,trigger);scheduler.start();}}HelloJob:
package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;import java.util.Date;/** * 功能描述: 定时业务功能 * * @author XiaoNianXin * @date 2021/12/13 20:52 */public class HelloJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// 获取当前时间,并格式化Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateSrting = format.format(date);// 获取 JDMJobDataMap Detail_JDM = context.getJobDetail().getJobDataMap();JobDataMap Trigger_JDM = context.getTrigger().getJobDataMap();String detail_jdmString = Detail_JDM.getString("msg");String trigger_jdmString = Trigger_JDM.getString("msg");System.out.println("---------------------------------------------------");System.out.println("detail_jdmString = " + detail_jdmString);System.out.println("trigger_jdmString = " + trigger_jdmString);// 业务功能模拟System.out.println("开始备份数据库,时间:" + dateSrting);// 其他内容System.out.println("Job 运行时间:" + context.getJobRunTime());System.out.println("Job 当前运行时间:" + context.getFireTime());System.out.println("Job 下次运行时间:" + context.getNextFireTime());System.out.println("---------------------------------------------------");}}


推荐阅读