案例-使用Quartz框架编写定时任务

    技术2022-07-11  80

    Quartz框架

    任务(Job):需要执行的具体工作

    触发器(Trigger):在特定的时间触发任务的执行

    调度器(Scheduler):任务的实际执行者,负责粘合任务和触发器。

    案例:

    新建maven项目,添加Quartz依赖

    <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6</version> </dependency>

    新增任务明细类

    package cn.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class RemindJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("任务正在执行!"); } }

    测试类与cron表达式相关介绍,注意,触发器有两种创建方式,SimpleTrigger 与 CronTrigger

    package cn.quartz; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Date; public class TestMain { public static void main(String[] args) throws Exception { //创建任务 JobDetail jobDetail = new JobDetail("myJob","A",RemindJob.class); //创建触发器,指定固定时间间隔触发器:SimpleTrigger,通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等 //轮询模式,每三秒执行一次 SimpleTrigger simpleTrigger = new SimpleTrigger("mySimpleTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000); //设置开始时间位当前时间的下一秒 simpleTrigger.setStartTime(new Date(System.currentTimeMillis()+1000)); //指定时间点的触发器(比如每天凌晨3点执行一次):CronTrigger,实际开发中常用 //第三个参数,cron表达式,按位置分别表示为 //秒 分 时 月份中的哪一天 月 星期几 年 //按空格分隔,其中(月份中的哪一天)与(星期几)表示任意值时可用 ‘?’或‘*’ 号,其他字段表示任意值用‘*’号 //除了可以设置某个固定值,还可以设置一个范围(-)、一个列表(逗号间隔)、递增(初始值/增量)如: //"* 25-30 1 * * ?" :表示凌晨1点25分到30分的范围执行 //"* 20,30,40 1 * * ?" :表示凌晨1点20分,30分,40分执行 //"* 10/5 1 * * ?" :表示凌晨1点10分开始,每5分钟执行一次 //注意:(月份中的哪一天)与(星期几)字段不能同时使用‘?’,也不能同时使用'*'号,年字段可以省略(至少保证表达式中存在6个字段) //表示12时57分40秒执行 CronTrigger cronTrigger = new CronTrigger(",myCronTrigger", "B", "40 57 12 ? * *"); //创建调度器 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //调度器绑定任务与触发器 //scheduler.scheduleJob(jobDetail, simpleTrigger); scheduler.scheduleJob(jobDetail,cronTrigger); //调度器执行任务 scheduler.start(); //模拟主线程睡20秒后触发调度器停止 Thread.sleep(20000); //调度器停止任务 scheduler.shutdown(); } }

    在与Spring整合的项目中,可在Controller层在任务方法上直接使用

    @Scheduled(cron="0 0/10 * * * ?") 注解,就会定时执行该任务方法。

    spring配置文件中需引入spring-task.xsd文件

    在类中使用@Scheduled注解时,需要spring能扫到该类。

    Processed: 0.011, SQL: 9