Quartz任务调度框架使用

Quartz任务调度原理简析

一、串行任务

  解释:任务在上一次调度中没有结束,让下一次的调度进行等待,但是这样会影响定时调度的间隔

  实现方法:调度类继承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"
    }

}

 

posted @ 2019-04-23 14:27  阿衰问问  阅读(354)  评论(0编辑  收藏  举报