1.创建任务job
package com.example.demo.quartz;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springblade.core.tool.utils.DateUtil;
import java.util.Date;
//Job中的任务有可能并发执行,例如任务的执行时间过长,而每次触发的时间间隔太短,则会导致任务会被并发执行。如果是并发执行,就需要一个数据库锁去避免一个数据被多次处理。
@DisallowConcurrentExecution
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//获取JobDetail的传参
System.err.println(jobExecutionContext.getJobDetail().getJobDataMap().get("name"));
System.err.println(jobExecutionContext.getJobDetail().getJobDataMap().get("age"));
//获取触发器Trigger的传参
System.err.println(jobExecutionContext.getTrigger().getJobDataMap().get("orderNo"));
//此处可编写要定时执行的业务代码
System.err.println("定时任务执行,当前时间:"+ DateUtil.formatDateTime(new Date()));
}
}
2.测试demo
package com.example.demo.quartz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzDemo {
public static void main(String[] args) {
//创建任务调度器
Scheduler scheduler = null;
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
scheduler = schedulerFactory.getScheduler();
} catch (SchedulerException e) {
e.printStackTrace();
}
//启动定时任务调度器
try {
if (!scheduler.isShutdown()) {
scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
/**通过JobBuilder.newJob()方法获取到当前Job的具体实现(以下均为链式调用)
* 这里是固定Job创建,所以代码写死XXX.class
* 如果是动态的,根据不同的类来创建Job,则 ((Job)Class.forName("com.zy.job.TestJob").newInstance()).getClass()
* 即是 JobBuilder.newJob(((Job)Class.forName("com.zy.job.TestJob").newInstance()).getClass())
* */
//创建定时任务job
String jobKey = "job111";
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
/**给当前JobDetail添加参数,K V形式*/
.usingJobData("name","zy")
/**给当前JobDetail添加参数,K V形式,链式调用,可以传入多个参数,在Job实现类中,可以通过jobExecutionContext.getJobDetail().getJobDataMap().get("age")获取值*/
.usingJobData("age",23)
/**添加认证信息,有3种重写的方法,我这里是其中一种,可以查看源码看其余2种*/
.withIdentity(jobKey)
.build(); //执行
//创建定时任务触发器
String triggerKey = "trigger111";
CronTrigger trigger = TriggerBuilder.newTrigger()
/**给当前JobDetail添加参数,K V形式,链式调用,可以传入多个参数,在Job实现类中,可以通过jobExecutionContext.getTrigger().getJobDataMap().get("orderNo")获取值*/
.usingJobData("orderNo", "123456")
/**添加认证信息,有3种重写的方法,我这里是其中一种,可以查看源码看其余2种*/
.withIdentity(triggerKey)
/**立即生效*/
.startNow()
/**开始执行时间*/
//.startAt(start)
/**结束执行时间,不写永久执行*/
//.endAt(start)
/**添加执行规则,SimpleTrigger、CronTrigger的区别主要就在这里,我这里是demo,写了个每1分钟执行一次*/
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"))
.build();//执行
//添加定时任务
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
//延时给与定时任务一定执行时间
try {
Thread.sleep(30*60*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//停止并删除定时任务
try {
//暂停触发器
scheduler.pauseTrigger(TriggerKey.triggerKey(triggerKey));
//移除触发器
scheduler.unscheduleJob(TriggerKey.triggerKey(triggerKey));
//删除Job
scheduler.deleteJob(JobKey.jobKey(jobKey));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
说明:
1.scheduler.start();调度器启动后,执行scheduler.scheduleJob(jobDetail, trigger);往调度器放入定时任务,定时任务会进行执行。或者先放入定时任务到调度器,调度器再启动效果一样。
2.与业务有关的基本是:jobKey、triggerKey,以及在job和trigger中传的参数,还有Cron表达式,在创建定时任务时,可以作为入参进行动态创建定时任务
3.需要引用的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
引用:https://zhuanlan.zhihu.com/p/316238578