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

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能扫到该类。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章