quartz之基础

quartz整体结构:

我认为,quartz简单来说就是三部分:任务(jobdetail)、触发器(trigger)、调度器(scheduler),结构如图:
这里写图片描述

创建方式:

jobdetail trigger scheduler
JobBuilder创建 TriggerBuilder创建 SchedulerFactory创建

jobdetail:

组成:个人觉得jobdetail是由四部分组成的:名字、分组、job的class、JobDataMap(usingJobData)。

job的class: job就是具体需要定时执行的类,需要这个类实现Job这个接口。

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Hello World");
    }
}

名字和分组:顾名思义就是这个jobdetail的名字和属于哪个组(个人感觉这个没什么用,写着开心就好)。

 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                 //名字和组
                .withIdentity("job1", "group1")
                .build();

JobDataMap(usingJobData): 给执行的job传递参数,然后在job具体实现类中获取参数值,进行业务操作。

 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1", "group1")
                /**
                 * 可传入的值类型有:Integer,Float,Double,Boolean,Stirng
                 */
                //在jobdetail中传入参数值---String
                .usingJobData("ceshi", "aa")
                //在jobdetail中传入参数值---float
                .usingJobData("float", 3.14F)
                .build();
public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
       JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
       String ceshi = jobDataMap.getString("ceshi");
        //浮点类型
       float f = jobDataMap.getFloat("float");
       System.out.println(f);
       System.out.println(ceshi);
 }

trigger:

简介:这个东西个人理解就是规定什么时候去执行指定的job实现类。

分类:主要有SimpleTrigger和CronTrigger两个实现类。
这里写图片描述
组成: 名字、分组、ScheduleBuilder、JobDataMap(usingJobData)。

名字和分组: 这个东西和jobdetail一样,没什么区别。

JobDataMap(usingJobData): 内容是和jobdetail没什么区别的,注意:两者都存入相同的key,但是value不同的话,trigger会将jobdetail的value覆盖。(前提是在job的具体实现类中使用的是JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();

  JobDataMap jobDataMap2 = jobExecutionContext.getMergedJobDataMap();
        String ceshiz = jobDataMap2.getString("ceshi");
        //这里就体现了覆盖:jobdetail和trigger都有ceshi这个参数,但是这里获取的就是trigger中赋值的那个
        System.out.println(ceshiz);

JobDataMap通过get-set方法: 其实JobDataMap是可以通过set赋值的,前提是job的具体实现类需要有成员变量,而且提供get-set方法。

   JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("name", "小明")
                .usingJobData("age", "20")
                .build();
public class HelloJob implements Job {
    private String name;
    private String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
      @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      System.out.println(name);
        System.out.println(age);
    }
 }

ScheduleBuilder: 个人对这个东西的理解就是使用哪种形式的触发,和trigger的分类一样,常用的也有两种;SimpleScheduleBuilder和CronScheduleBuilder。相对来说SimpleScheduleBuilder比较简单,差不多就是隔多久触发一次,但是没法设置具体什么时候触发;CronScheduleBuilder比较复杂,但是灵活,需要用cron表达式,在项目中通常使用的就是CronScheduleBuilder。

扫描二维码关注公众号,回复: 2772708 查看本文章
  SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                //withIntervalInSeconds中的值必须是0或者正整数(单位是秒) - - 不然会报错
                                 //每两秒触发一次
                                .withIntervalInSeconds(2)
                                //SimpleTrigger.REPEAT_INDEFINITELY:表示永远执行
                                .withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
                )
                .startAt(startdate)
                .build();
  CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(
                   //使用cron表达式,http://cron.qqe2.com/
                   CronScheduleBuilder.cronSchedule("* 18 21 * * ?")
                )
                .build();

Scheduler

简介: 官方术语叫做调度器,个人理解为读取trigger触发机制,然后告诉job的具体实现类什么时候执行任务。

两种创建方式: StdSchedulerFactory和DirectSchedulerFactory,一般都用StdSchedulerFactory创建。

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
DirectSchedulerFactory schedulerFactory1 = DirectSchedulerFactory.getInstance();
Scheduler scheduler1=schedulerFactory1.getScheduler();

组成: jobdetail和trigger

scheduler.scheduleJob(jobDetail, trigger);
//启动任务调度
scheduler.start();

其他函数: start(开始)、standby(挂起)、shutdown(关闭)、isShutdown(判断是否关闭)。个人觉得没什么意思,可以参考:https://github.com/mzd123/quartz_base/blob/master/src/p6_Scheduler/HelloScheduler.java

注意: scheduler.scheduleJob(jobDetail, trigger);的返回值是下次要执行的时间

猜你喜欢

转载自blog.csdn.net/tuesdayma/article/details/81530830