Quartz概念详解

1、Quartz是什么:

      Quartz是由Java开发,可以用来执行定时任务的开源框架

2、主要概念

  • Scheduler - 与调度程序交互的API。
  • Job - 由希望由调度程序执行的组件实现的接口。
  • JobDetail - 用于定义作业的实例。
  • Trigger(即触发器) - 定义执行给定作业的计划的组件。
  • JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
  • TriggerBuilder - 用于定义/构建触发器实例。

      通俗介绍,Job是用来定义定时任务的任务逻辑,也就具体做什么工作,比如可以是发邮件、发短信等逻辑。JobDetail是用来创建Job实例对象的,为什么会出现JobDetail呢,因为同一个任务逻辑可能被多次被执行,为了所以各司其职,让各个任务独立执行,使用JobDetail创建每个Job实例对象。有了Job和JobDetail后,明确了具体要做什么任务做什么事,但是什么时候做这些事以及多久做一次呢,这个需要trigger来指定,trigger用来定义执行时间,执行间隔,运行次数等。然后最后通过scheduler调度器,来绑定jobdetail和trigger,这样的话在scheduler启动后,定义的job就会按照trigger定义的执行时间、执行间隔和运行次数等要求来执行job中的任务逻辑。

      先来个简单的案例来大致了解是quartz是怎么回事。

     (1)因为quartz的maven依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

      (2)定义实现Job接口的任务逻辑类,此处仅仅打印字符串:rabbitbb

public class JobTest implements Job {
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("this is the first quartz test");
    }
}

      (3)主类(在其中定义了jobdetail,trigger和scheduler等,然后启动了scheduler

public class TestMain {
    public static void main(String[] args) {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            JobDetail jobDetail1 = JobBuilder.newJob(JobTest.class).withIdentity("job1","group1").build();
            JobDetail jobDetail2 = JobBuilder.newJob(JobTest.class).withIdentity("job2","group1").build();
            Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                    .startNow()//立即生效
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1)//每隔1s执行一次
                            .repeatForever()).build();//一直执行

            Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity("trigger2", "triggerGroup1")
                    .startNow()//立即生效
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1)//每隔1s执行一次
                            .repeatForever()).build();//一直执行
            scheduler.scheduleJob(jobDetail1,trigger1);
            scheduler.scheduleJob(jobDetail2,trigger2);
            scheduler.start();
            TimeUnit.MINUTES.sleep(1);
            scheduler.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      打印结果:this is the first quartz test

4、Scheduler

      Scheduler是Quartz中的任务调度器,他的生命期从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)。SchedulerBuilder接口的各种实现类,可以定义不同类型的调度计划(scheduler)。

5、Job和JobDetail

      Job是Quartz中的一个接口,接口下只有execute方法,在这个方法中编写业务逻辑。JobDetail需要绑定Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。设计成JobDetail + Job,不直接使用Job的原因:JobDetail定义的是任务数据,而真正的执行逻辑是在Job中。 因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail+Job 方式,Sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。

6、trigger

Trigger是Quartz的触发器,会去通知Scheduler何时去执行对应Job。包括SimpleTrigger和CronTrigger两种trigger。SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基于Cron表达式的,先了解下Cron表达式: 
由7个子表达式组成字符串的,格式如下:

[秒] [分] [小时] [日] [月] [周] [年]

此处提供一个在线生成Cron表达式的服务:https://cron.qqe2.com/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值