Quartz 简单使用

一给  金牌会员 | 2023-4-12 12:20:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 888|帖子 888|积分 2664

Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的)
Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞
@DisallowConcurrentExecution: job类上,禁止并发地执行同一个job定义 (JobDetail定义的)的多个实例。
简单示例

TestClient.Java
  1. import org.quartz.*;
  2. import org.quartz.impl.StdSchedulerFactory;
  3. public class TaskClient {
  4.     public static void main(String[] args) {
  5.         JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
  6.                 .withIdentity("job1", "group1")  //设置JOB的名字和组
  7.                 .build();
  8.         Trigger trigger = TriggerBuilder.newTrigger()
  9.                 .withIdentity("trigger1", "trigger1")
  10.                 .startNow()
  11.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
  12.                         .repeatForever())
  13.                 .build();
  14.         try {
  15.             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  16.             scheduler.scheduleJob(jobDetail,trigger);
  17.             scheduler.start();
  18.         } catch (SchedulerException ex) {
  19.             ex.printStackTrace();
  20.         }
  21.     }
  22. }
复制代码
TaskJob.Java
  1. import cn.hutool.core.date.DateUtil;
  2. import org.quartz.Job;
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. public class TaskJob implements Job {
  6.     @Override
  7.     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  8.         System.out.println("TaskJob => " + DateUtil.now());
  9.     }
  10. }
复制代码

usingJobData

通过 usingJobData 往定时任务中传递参数
  1. import org.quartz.*;
  2. import org.quartz.impl.StdSchedulerFactory;
  3. public class TaskClient {
  4.     public static void main(String[] args) {
  5.         JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
  6.                 .withIdentity("job1", "group1")
  7.                 .usingJobData("job","jobDetail1.JobDataMap.Value")
  8.                 .build();
  9.         Trigger trigger = TriggerBuilder.newTrigger()
  10.                 .withIdentity("trigger1", "trigger1")
  11.                 .usingJobData("trigger","trigger.JobDataMap.Value")
  12.                 .startNow()
  13.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
  14.                         .repeatForever())
  15.                 .build();
  16.         try {
  17.             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  18.             scheduler.scheduleJob(jobDetail,trigger);
  19.             scheduler.start();
  20.         } catch (SchedulerException ex) {
  21.             ex.printStackTrace();
  22.         }
  23.     }
  24. }
复制代码
TaskJob.java
  1. import org.quartz.Job;
  2. import org.quartz.JobDataMap;
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. public class TaskJob implements Job {
  6.     @Override
  7.     public void execute(JobExecutionContext context) throws JobExecutionException {
  8.         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
  9.         JobDataMap triggerMap = context.getTrigger().getJobDataMap();
  10.         JobDataMap mergeMap = context.getMergedJobDataMap();
  11.         System.out.println("jobDataMap => " + jobDataMap.getString("job"));
  12.         System.out.println("triggerMap => " + triggerMap.getString("trigger"));
  13.         System.out.println("mergeMap => " + mergeMap.getString("trigger"));
  14.     }
  15. }
复制代码

通过 属性赋值
  1. import org.quartz.*;
  2. import org.quartz.impl.StdSchedulerFactory;
  3. public class TaskClient {
  4.     public static void main(String[] args) {
  5.         JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
  6.                 .withIdentity("job1", "group1")
  7.                 .usingJobData("job","jobDetail1.JobDataMap.Value")
  8.                 .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
  9.                 .build();
  10.         Trigger trigger = TriggerBuilder.newTrigger()
  11.                 .withIdentity("trigger1", "trigger1")
  12.                 .usingJobData("trigger","trigger.JobDataMap.Value")
  13.                 .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
  14.                 .startNow()
  15.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
  16.                         .repeatForever())
  17.                 .build();
  18.         try {
  19.             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  20.             scheduler.scheduleJob(jobDetail,trigger);
  21.             scheduler.start();
  22.         } catch (SchedulerException ex) {
  23.             ex.printStackTrace();
  24.         }
  25.     }
  26. }
复制代码
  1. import org.quartz.*;
  2. public class TaskJob implements Job {
  3.     private String name;
  4.     public void setName(String name) {
  5.         this.name = name;
  6.     }
  7.     @Override
  8.     public void execute(JobExecutionContext context) throws JobExecutionException {
  9.         System.out.println("name => " + name);
  10.     }
  11. }
复制代码
非并发执行

@DisallowConcurrentExecution job类上,禁止并发地执行同一个job定义 (JobDetail定义的)的多个实例。
  1. import cn.hutool.core.date.DateUtil;
  2. import org.quartz.*;
  3. @DisallowConcurrentExecution
  4. public class TaskJob implements Job {
  5.     @Override
  6.     public void execute(JobExecutionContext context) {
  7.         System.out.println("Time => " + DateUtil.now());
  8.         try {
  9.             Thread.sleep(3000);
  10.         } catch (InterruptedException e) {
  11.             e.printStackTrace();
  12.         }
  13.     }
  14. }
复制代码
@PersistJobDataAfterExecution
持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
  1. import cn.hutool.core.date.DateUtil;
  2. import org.quartz.*;
  3. //持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
  4. @PersistJobDataAfterExecution
  5. public class TaskJob implements Job {
  6.     @Override
  7.     public void execute(JobExecutionContext context) {
  8.         JobDataMap triggerMap = context.getJobDetail().getJobDataMap();
  9.         triggerMap.put("count", triggerMap.getInt("count") + 1);
  10.         System.out.println("Time => " + DateUtil.now() + " count =>" + triggerMap.getInt("count"));
  11.     }
  12. }
复制代码
Client
  1. import org.quartz.*;
  2. import org.quartz.impl.StdSchedulerFactory;
  3. public class TaskClient {
  4.     public static void main(String[] args) {
  5.         JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
  6.                 .withIdentity("job1", "group1")
  7.                 .usingJobData("job","jobDetail1.JobDataMap.Value")
  8.                 .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
  9.                 .usingJobData("count",0) //通过 setName 自动赋值
  10.                 .build();
  11.         Trigger trigger = TriggerBuilder.newTrigger()
  12.                 .withIdentity("trigger1", "trigger1")
  13.                 .usingJobData("trigger","trigger.JobDataMap.Value")
  14.                 .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
  15.                 .startNow()
  16.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
  17.                         .repeatForever())
  18.                 .build();
  19.         try {
  20.             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  21.             scheduler.scheduleJob(jobDetail,trigger);
  22.             scheduler.start();
  23.         } catch (SchedulerException ex) {
  24.             ex.printStackTrace();
  25.         }
  26.     }
  27. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表