Quartz---Java定时任务调度工具

时间:2023-01-13 20:00:36
    一、三个核心概念
  • 调度器(scheduler)
  • 任务(job)
  • 触发器(trigger)
    二、主要用到的设计模式
  • Builder模式(创建jobdetail,trigger)
  • Factory模式(创建Scheduler)
  • 组件模式
  • 链式写法
    三、重要组成
  • Job
  • JobDetail
  • JobDetail
  • JobStore
  • Trigger:SimpleTrigger、CronTrigger
  • TriggerBuilder:
  • ThreadPool:共享线程池,解决并发问题
  • Scheduler
  • Calendar:一个Trigger可以和多个Calendar关联,以排除或包含某些时间点
  • 监听器:JobListener,TriggerListner,SchedulerListener
    四、一张图![Quartz体系结构](http://img.blog.csdn.net/20170815185405168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSURvZzE0OXRhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    五、浅谈Job
  • Job实例在Quartz中的生命周期

    每次调度器执行job时,它在调用execute()方法前会创建1个新的job实例。

    当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
  • JobDetail重要属性:name,group,jobClass,jobDataMap
  • JobExecutionContext:Job通过访问JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据
  • JobDataMap:在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取;JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时会传递参数给这些对象;JobDataMap实现了JDK的map接口(key-value)。

用法1:在jobDetail或者Trigger里用“usingJobData()”添加键值对数据,在job里用jobDataMap中的getJobDataMap()或者getMergedJodDataMap()获取【若Trigger和JobDetail的key值一致,getMergedJodDataMap()会覆盖掉JobDetail中的值】。举例说明:

        //添加数据
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1")
.usingJobData("message", "hello jobDetail1")
.usingJobData("message", "hello jobDetail2")
.build();
//获取数据
JobDataMap jobDataMap=context.getJobDetail().getJobDataMap();
String msg1=jobDataMap.getString("message");

用法2:直接在Job类中添加setter()方法对应JobDataMap的键值。

    六、浅谈Trigger
  • Trigger通用属性:Jobkey/StartTime/EndTime,StartTime和EndTime的值类型是java.util.Date.
  • CronTrigger:基于日历的作业调度。
  • Cron表达式:秒、分钟、小时、日、月、周、天。
    此处应插2张图 ![Cron表达式特殊字符意义对应表]()
    ![通配符说明]()
    七、浅谈Scheduler

使用Quartz实现任务:每2秒打印一次“Hello Job”

HelloJob.java

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

public void execute(JobExecutionContext arg0) throws JobExecutionException {
// 编写具体的业务逻辑
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Exec time is: "+sdf.format(date));
System.out.println("Hello Job!");
}

}

HelloScheduler.java

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
public static void main(String[] args) throws SchedulerException{
//使用builder模式创建1个JobDetail实例,将该实例与HelloJob.class绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).
withIdentity("myJob","group1").build();
//使用builder模式创建1个Trigger实例,定义该job立即执行,并且每隔2秒钟重复执行1次,直到永远
Trigger trigger=TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow().withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever())
.build();
//创建Scheduler实例,使用factory模式创建
SchedulerFactory sfact=new StdSchedulerFactory();
Scheduler scheduler=sfact.getScheduler();
scheduler.start();

Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current time is: "+sdf.format(date));

scheduler.scheduleJob(jobDetail, trigger);




}
}