Quartz快速入门

320 阅读2分钟

quartz是一个定时任务框架,采用Java开发,借助这个框架,可以让程序周期性的执行某个人物,他支持多种形式的时间制定,即执行的时间周期。Java中原生的Timer也有定时任务的功能,但是Quartz更加强大,管理也更加方便,多数开源框架也使用到了这个定时框架。

下面我们来快速入门一下这个好用的框架。

概念学习

  1. 任务
  2. 触发器
  3. 调度器

任务Job和JobDetail

定时任务调度,你总得有任务吧,所以就有这么一个接口Job,

图片.png 这个重写的方法,就是我们想要被调度的任务了。

那JobDetail是什么呢?他绑定了一个Job.class,通过JobDetail可以获取到一些Job的信息,后续我们可以看到如何使用。

图片.png

触发器Trigger

什么是触发器?就是什么时候去执行一个任务,在这里可以指定调用的时间。包括包括SimpleTrigger和CronTrigger,两种形式的时间指定触发器。

调度器

那么有了任务和触发器,如何让触发器知道调用哪个任务,就需要调度来进行协调。

总结

概念还是比较清晰的,但是上手使用可能还有点懵逼,接下来我们就具体来看看如何使用。

Quartz使用

  1. 导入依赖
<!-- 定时任务 -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>
  1. 实现任务
public class PrintJob implements Job {


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("我是定时任务:"+this);
    }
}

注意:JobExecutionContext类是quartz的上下文环境,可以获取相应的内容。

public interface JobExecutionContext {
    Scheduler getScheduler();

    Trigger getTrigger();

    Calendar getCalendar();

    boolean isRecovering();

    TriggerKey getRecoveringTriggerKey() throws IllegalStateException;
  ...具体的可以点进去查看
}
  1. 设置触发器 SimpleTrigger
// 这是具体的触发器,多久触发一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
        .startNow()//立即生效
        .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1)//每隔1s执行一次
                .repeatForever()).build();//一直执行

CronTrigger

CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                .usingJobData("trigger1", "这是jobDetail1的trigger")
                .startNow()//立即生效
                .startAt(startDate)
                .endAt(endDate)
                .withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 2022"))
                .build();

SimpleTrigger使用较为简单一些,而CronTrigger难一些,因为cron表达式比较难搞,如果学过linux的,应该对这个不陌生。

cron表达式格式:[秒] [分] [小时] [日] [月] [周] [年] 上面的例子是2022年的每周一到周五的上午十点半执行一次。

4.结合调度器 这个比较简单,可以直接看最终代码

StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();

//这是具体的任务
JobDetail jobDetail = JobBuilder.newJob(PrintJob.class).
//设置名称和group组
        withIdentity("name1", "group1").build();


// 这是具体的触发器,多久触发一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger-name", "triggerGroup1")
        .startNow()//立即生效
        .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1)//时间间隔为1秒
                //重复执行
                .repeatForever()).build();

//将触发器和任务结合起来,让触发器知道到点了该调度哪个任务
scheduler.scheduleJob(jobDetail,trigger);

System.out.println("start");
scheduler.start();

//十秒后将定时任务停止
Thread.sleep(10000);
scheduler.shutdown();
System.out.println("end");