一、串行任务
解释:任务在上一次调度中没有结束,让下一次的调度进行等待,但是这样会影响定时调度的间隔
实现方法:调度类继承StatefulJob(有状态的Job)即可
public class WelcomeJob implements StatefulJob { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello!"); } }
二、带参调度
解释:在调度的时候提供不同的参数
场景:同一业务的不同参数
实现方法:在注册任务的时候,通过添加 JobData 将参数带到调度的类中,由JobExecutionContext对象携带,并从中获取
传递(QuartzManager.java):
public void addJob(ScheduleJob job) { try { // 创建jobDetail实例,绑定Job实现类 // 指明job的名称,所在组的名称,以及绑定job类 Class<? extends Job> jobClass = (Class<? extends Job>) (Class.forName(job.getBeanClass()).newInstance() .getClass()); JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// 任务名称和组构成任务key .usingJobData("message","Hello") //使用JobData传递参数 .build(); // 定义调度触发规则 // 使用cornTrigger规则 Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// 触发器key .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND)) .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build(); // 把作业和触发器注册到任务调度中 scheduler.scheduleJob(jobDetail, trigger); // 启动 if (!scheduler.isShutdown()) { scheduler.start(); } } catch (Exception e) { e.printStackTrace(); } }
可携带多种类型参数
引用(WelcomeJob.java):
public class WelcomeJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap data = context.getJobDetail().getJobDataMap(); String message=data.getString("message"); //message: "Hello" } }