Quartz是一个定时任务调度框架,可以将其理解为一个闹钟,可以设置在具体的某个时间,同样可以设置是否按某种规则循环
调度容器,所有的调度都由他控制,所有的任务都是从这里开始的
JobDetail:任务数据
Job:真正的执行逻辑
调度任务的时间规则
org.quartz-scheduler
quartz
2.3.2
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* @author Dora
* @since 2022/8/1 16:46
*/
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail jobDetail = jobExecutionContext.getJobDetail();
System.out.println(jobDetail.getKey());
Trigger trigger = jobExecutionContext.getTrigger();
System.out.println(trigger.getKey());
String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));
}
}
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author Dora
* @since 2022/8/1 17:25
*/
public class Test {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//1、得到对应的Scheduler对象
Scheduler scheduler = schedulerFactory.getScheduler();
//2、定义一个JobDetail
// jobDetail中携带自定义参数
JobDataMap dataMap = new JobDataMap();
dataMap.put("msgRuleConfig", "msgRuleConfig");
JobDetail jobDetail = JobBuilder.newJob(TestJob.class)
.withIdentity("job", "jobGroup") // JobKey,如果需要通过Scheduler停止Job,需要用到这个JobKey,所以JobKey需要唯一
.usingJobData(dataMap)
.build();
//3、定义一个Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger", "triggerGroup") //triggerKey
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1s执行一次
.repeatForever()).build();//一直执行
//4、整合jobDetail和trigger
scheduler.scheduleJob(jobDetail, trigger);
//5、启动任务
scheduler.start();
//删除job:scheduler.deleteJob(JobKey));
//停止Scheduler:scheduler.shutdown();
}
}
首先,一个Scheduler可以同时管理多个Job
其次Scheduler可以启动和停止,是通过Scheduler的start和shutdown;Job本身是通过trigger设置的时间规则来启动和运行,同时也可有通过Scheduler来停止Job
启动Scheduler:
scheduler.start();
停止Scheduler:
scheduler.shutdown()
//1、暂停trigger触发器
scheduler.pauseTrigger(triggerKey);
//2、移除trigger触发器
scheduler.unscheduleJob(triggerKey);
//3、删除任务
scheduler.deleteJob(jobKey);
1、Scheduler是Quartz的核心所在,所有的任务都是通过Scheduler开始的
2、Scheduler是一个接口类,所有的具体实现都是通过SchedulerFactory实现的;如果是Spring管理的,通过@Autowired注入也是可以的
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//1、暂停trigger触发器
scheduler.pauseTrigger(triggerKey);
//2、移除trigger触发器
scheduler.unscheduleJob(triggerKey);
//3、删除任务
scheduler.deleteJob(jobKey);
具体的业务逻辑,定义类继承Job, 重写execute方法完善业务逻辑
import org.quartz.*;
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
}
}
为Job实例提供了许多设置属性
重要属性:name,group,jobClass,jobDataMap
JobDataMap dataMap = new JobDataMap();
dataMap.put("msgRuleConfigData", msgRuleConfig);
JobDetail jobDetail =
// JobClass
JobBuilder.newJob(SendMsgJob.class)
//设置jobName和JobGroup,jobName是唯一的,可以通过withIdentity(String name, String group),也可以先构建JobKey然后通过withIdentity(JobKey jobKey)设置
.withIdentity("jobName", "jobGroup")
//JobDataMap,job成员变量属性
.usingJobData(dataMap)
.build();
定时任务的时间触发规则,主要两个实现类:CronTriggerImpl与SimpleTriggerImpl。
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TriggerKey)
//立即生效
.startNow()
// 设置Trigger模式为SimpleTrigger
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
// 设置定时器间隔时间,以小时为单位
.withIntervalInHours(long)
// 始终重复
.repeatForever()
).build();//一直执行
//创建一个CronTrigger实例
CronTrigger trigger=(CronTrigger)TriggerBuilder.newTrigger()
.withIdentity("trigger", "group")//定义name/group
.withSchedule(CronScheduleBuilder.cronSchedule("0 5 21 * * ? *")) //填写cron表达式
.build();
关于cron表达式,参考文章:java 定时任务 @Scheduled的表达式