上面三个部分就是Quartz的基本组成部分:
调度器:Scheduler
任务:JobDetail
触发器:Trigger,包括SimpleTrigger和CronTrigger
demo:
@RestController
@RequestMapping
public class TaskController {
@Resource
private TaskMgr taskMgr;
@GetMapping("/testQuartz")
public void testQuartz() {
taskMgr.createRepeatTask();
}
}
@Slf4j
@Service
public class TaskMgr {
@Resource
private ScheduleTaskMgr scheduleTaskMgr;
@Resource
private Executor taskExecutor;
@SneakyThrows
public void createRepeatTask() {
//任务信息持久化,获取任务id
long taskId = 1l;
//创建定时任务
createScheduleTask(1);
Thread.sleep(3000);
//任务创建执行时-- 异步保存定时任务日志记录
taskExecutor.execute(() -> afterCreateTask(taskId));
// taskExecutor.execute(this::createRepeatTask);
}
private void createScheduleTask(long taskId) {
scheduleTaskMgr.createRepeatTask(taskId);
}
private void afterCreateTask(long taskId) {
log.info("===========任务创建执行时-异步保存定时任务日志记录===============");
}
}
@Component
public class ScheduleTaskMgr {
@Autowired
private Scheduler scheduler;
private static final String dataKey = "SOME_TASK_ID";
@SneakyThrows
public void createRepeatTask(long taskId) {
String jobName = "job1";
String jobGroupName = "jobGroup1";
int intervalTime = 2;
int repeatCount = 5;
Date startTime = new Date();
Date endTime = new Date();//TimeUtil.addSeconds( new Date(),10) ;
//1、创建jobDetail
String jobData = "" + taskId;
JobDetail jobDetail = createJobDetail(jobData, jobName, jobGroupName);
//2、创建触发器Trigger
Trigger trigger = createTrigger(jobName, jobGroupName, new Date(), new Date(), intervalTime, repeatCount);
//3、调度器
scheduler.scheduleJob(jobDetail,trigger);
}
private JobDetail createJobDetail(String taskId, String jobName, String jobGroupName) {
JobDetail jobDetail = JobBuilder.newJob(MyJobProcessor.class)
.withIdentity(jobName, jobGroupName)
.usingJobData(dataKey, taskId)
.build();
return jobDetail;
}
private Trigger createTrigger(String jobName, String jobGroupName, Date startTime, Date endTime, int intervalTime, int repeatCount) {
SimpleScheduleBuilder builder = SimpleScheduleBuilder.repeatSecondlyForTotalCount(repeatCount, intervalTime);
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.forJob(jobName, jobGroupName)
.startNow()
// .startAt(startTime)
// .endAt(endTime)
.withSchedule(builder)
.build();
return trigger;
}
}
@Slf4j
@DisallowConcurrentExecution
public class MyJobProcessor extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.info("----任务触发后到业务代码");
JobDetail jobDetail = context.getJobDetail();
JobDataMap jobDataMap = jobDetail.getJobDataMap();
System.identityHashCode(jobDetail.getJobClass().getClass());
}
}