详解Java中Quartz的简单使用

  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();

  }

  }

  }

  到此这篇关于详解Java中Quartz的简单使用的文章就介绍到这了,更多相关Java Quartz内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: