Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的)
Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞
@DisallowConcurrentExecution: job类上,禁止并发地执行同一个job定义 (JobDetail定义的)的多个实例。
简单示例
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
通过 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();
- }
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |