quartz 原理简介
所属分类 quartz
浏览量 97
Quartz 开源作业调度框架
org.quartz.Job 接口
void execute(JobExecutionContext context) throws JobExecutionException;
类似 java.util.Timer ,Quartz 增强了功能:
作业持久性化
作业管理
Quartz 的核心类 :
任务 Job : 任务类,实现 execute() 方法
触发器 Trigger : SimpleTrigger 和 CronTrigger
调度器 Scheduler : 基于 Trigger触发器,执行 Job任务
org.quartz-scheduler:quartz:2.3.0
public class HelloJob implements Job {
private static final AtomicLong ID = new AtomicLong(0);
private final String name;
public HelloJob(){
name = "HelloJob_"+ID.incrementAndGet();
}
@Override
public void execute(JobExecutionContext context) {
log.error("{} run,now={}",name, DateUtil.now());
}
}
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
// 1.创建调度器 Scheduler
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
// 2.创建JobDetail实例,并与HelloJob类绑定
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
// 3.构建Trigger实例,每隔5s执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever())
.build();
// 4.执行,开启调度器
scheduler.scheduleJob(job, trigger);
System.out.println(System.currentTimeMillis());
scheduler.start();
//主线程睡眠1分钟,然后关闭调度器
TimeUnit.MINUTES.sleep(1);
scheduler.shutdown();
System.out.println(System.currentTimeMillis());
org.quartz.JobKey
Uniquely identifies a JobDetail.
Keys are composed of both a name and group, and the name must be unique within the group.
If only a name is specified then the default group name will be used.
org.quartz.utils.Key#DEFAULT_GROUP
// The default group for scheduling entities, with the value "DEFAULT".
public static final String DEFAULT_GROUP = "DEFAULT";
JobDetail
name 任务名称
group 任务分组,默认分组 DEFAULT
jobClass 任务类
jobDataMap 任务参数信息
Scheduler 调度执行Job,创建Job实例,执行Job中的execute()方法,执行结束后,释放Job对象实例
JobDetail + Job
JobExecutionContext
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
// 定义任务添加自定义参数
.usingJobData("quartz", "quartz 自定义参数")
.build();
构建Trigger实例,每隔30s执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
// Trigger 添加自定义参数
.usingJobData("trigger", "trigger 自定义参数")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(30)
.repeatForever())
.build();
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Object triggerParams = context.getTrigger().getJobDataMap().get("trigger");
Object quartzParams = context.getJobDetail().getJobDataMap().get("quartz");
}
}
Job状态参数
JobDataMap
Trigger 可以设置任务的开始结束时间, Scheduler 会根据参数进行触发。
Calendar instance = Calendar.getInstance();
Date startTime = instance.getTime();
instance.add(Calendar.MINUTE, 1);
Date endTime = instance.getTime();
// 3.构建Trigger实例
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
// 开始时间
.startAt(startTime)
// 结束时间
.endAt(endTime)
.build();
Trigger 可以设置任务的开始结束时间, Scheduler 会根据参数进行触发。
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(context.getTrigger().getStartTime());
System.out.println(context.getTrigger().getEndTime());
}
TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(30)
.repeatForever())
TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(30)
.withRepeatCount(5))
withRepeatCount(count) 重复次数,实际运行次数 count+1
TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
quartz job默认无状态 ,每次调用都会创建一个新的 JobDataMap
job实现类加上注解 @PersistJobDataAfterExecution
//多次调用 Job 的时候,将参数保留在 JobDataMap
@PersistJobDataAfterExecution
public class JobStatus implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
long count = (long) context.getJobDetail().getJobDataMap().get("count");
System.out.println("当前执行,第" + count + "次");
context.getJobDetail().getJobDataMap().put("count", ++count);
}
}
JobDetail job = JobBuilder.newJob(JobStatus.class)
.withIdentity("statusJob", "group1")
.usingJobData("count", 1L)
.build();
https://gitee.com/dyyx/work2024/tree/master/demo/springboot2demo/demo-task-quartz
上一篇
下一篇
java final 字段 反射修改说明
煎荷包蛋小技巧
mac brew 安装 openjdk17
Quartz简介
quartz countJob 实例
quartz 配置文件 quartz.properties