Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞
简单示例
TestClient.Java
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class
.withIdentity("job1", "group1" //设置JOB的名字和组
.build(;
Trigger trigger = TriggerBuilder.newTrigger(
.withIdentity("trigger1", "trigger1"
.startNow(
.withSchedule(SimpleScheduleBuilder.simpleSchedule(.withIntervalInSeconds(1
.repeatForever(
.build(;
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(;
scheduler.scheduleJob(jobDetail,trigger;
scheduler.start(;
} catch (SchedulerException ex {
ex.printStackTrace(;
}
}
}
TaskJob.Java
import cn.hutool.core.date.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext throws JobExecutionException {
System.out.println("TaskJob => " + DateUtil.now(;
}
}
usingJobData
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class
.withIdentity("job1", "group1"
.usingJobData("job","jobDetail1.JobDataMap.Value"
.build(;
Trigger trigger = TriggerBuilder.newTrigger(
.withIdentity("trigger1", "trigger1"
.usingJobData("trigger","trigger.JobDataMap.Value"
.startNow(
.withSchedule(SimpleScheduleBuilder.simpleSchedule(.withIntervalInSeconds(1
.repeatForever(
.build(;
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(;
scheduler.scheduleJob(jobDetail,trigger;
scheduler.start(;
} catch (SchedulerException ex {
ex.printStackTrace(;
}
}
}
TaskJob.java
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail(.getJobDataMap(;
JobDataMap triggerMap = context.getTrigger(.getJobDataMap(;
JobDataMap mergeMap = context.getMergedJobDataMap(;
System.out.println("jobDataMap => " + jobDataMap.getString("job";
System.out.println("triggerMap => " + triggerMap.getString("trigger";
System.out.println("mergeMap => " + mergeMap.getString("trigger";
}
}
通过 属性赋值
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class
.withIdentity("job1", "group1"
.usingJobData("job","jobDetail1.JobDataMap.Value"
.usingJobData("name","jobDetail1.name.Value" //通过 setName 自动赋值
.build(;
Trigger trigger = TriggerBuilder.newTrigger(
.withIdentity("trigger1", "trigger1"
.usingJobData("trigger","trigger.JobDataMap.Value"
.usingJobData("name","trigger.name.Value" //如果 Trigger 有值,会覆盖 JobDetail
.startNow(
.withSchedule(SimpleScheduleBuilder.simpleSchedule(.withIntervalInSeconds(1
.repeatForever(
.build(;
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(;
scheduler.scheduleJob(jobDetail,trigger;
scheduler.start(;
} catch (SchedulerException ex {
ex.printStackTrace(;
}
}
}
import org.quartz.*;
public class TaskJob implements Job {
private String name;
public void setName(String name {
this.name = name;
}
@Override
public void execute(JobExecutionContext context throws JobExecutionException {
System.out.println("name => " + name;
}
}
非并发执行
@DisallowConcurrentExecution job类上,禁止并发地执行同一个job定义 (JobDetail定义的的多个实例。
import cn.hutool.core.date.DateUtil;
import org.quartz.*;
@DisallowConcurrentExecution
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context {
System.out.println("Time => " + DateUtil.now(;
try {
Thread.sleep(3000;
} catch (InterruptedException e {
e.printStackTrace(;
}
}
}
@PersistJobDataAfterExecution
持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
import cn.hutool.core.date.DateUtil;
import org.quartz.*;
//持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
@PersistJobDataAfterExecution
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context {
JobDataMap triggerMap = context.getJobDetail(.getJobDataMap(;
triggerMap.put("count", triggerMap.getInt("count" + 1;
System.out.println("Time => " + DateUtil.now( + " count =>" + triggerMap.getInt("count";
}
}
Client
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class
.withIdentity("job1", "group1"
.usingJobData("job","jobDetail1.JobDataMap.Value"
.usingJobData("name","jobDetail1.name.Value" //通过 setName 自动赋值
.usingJobData("count",0 //通过 setName 自动赋值
.build(;
Trigger trigger = TriggerBuilder.newTrigger(
.withIdentity("trigger1", "trigger1"
.usingJobData("trigger","trigger.JobDataMap.Value"
.usingJobData("name","trigger.name.Value" //如果 Trigger 有值,会覆盖 JobDetail
.startNow(
.withSchedule(SimpleScheduleBuilder.simpleSchedule(.withIntervalInSeconds(1
.repeatForever(
.build(;
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(;
scheduler.scheduleJob(jobDetail,trigger;
scheduler.start(;
} catch (SchedulerException ex {
ex.printStackTrace(;
}
}
}