作业调度Quartz简介与案例

最近在做一个值班机器人,每个工作日早上10点在群里提醒对应的人当天是他On Call,类似这样的定时任务可以有很多实现方式,本人选择最经典的Quartz进行实现,由此向大家介绍一下Quartz是什么东西。

Quartz简介

简介: 根据Quartz官网介绍,Quartz是一个开源免费的Apache项目,是一个功能丰富的开源作业调度,可以集成到任何Java应用程序中,从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的调度,用于执行数百、数千甚至数万个作业;其任务定义为标准的Java组件作业,可以执行任何可编程的任务。Quartz调度程序包含许多企业级特性,例如对JTA事务和集群的支持。

应用场景: 即可以进行任务的定时或者固定频率的执行,例如支付宝的花呗会在每月的固定时期计算你上一个月的花费,从而提醒你这个月的还款,再者就是企业每月固定的工资发放等等应用场景

Quartz三要素

既然知道了Quartz是作业调度用的,那么接下来通过介绍三要素先来了解一下Quartz是如何进行作业调度的。
Quartz包含三个重要的接口(Scheduler、Trigger、Job)
Scheduler(调度器): 可以理解为作业调度框架的Boss,它负责作业的出发,调度,以及执行的协调统一,下面将的Trigger和JobDetail可以注册到Scheduler中。
Trigger(触发器): 作业什么时候触发,什么时候执行是在这里定义的,大致可以分为固定间隔触发和定时触发,分别对应SimpleTrigger和CronTrigger。
JobDetail(作业描述): 可以理解为是Job的包装,一个JobDetail会创建一个Job实例,JobDetail会注册到Scheduler中。
一句话总结:Sechduler负责调度,Trigger负责定义触发规则,JobDetail定义Job。
一句话总结:Sechduler负责作业调度,Trigger负责定义触发作业的规则,JobDetail定义Job。

Demo三部曲

Quartz的编码很简单,只需要按照三要素进行三部曲编码即可。
接下来看一下第一个案列,如何实现每个10秒执行一个任务
定义Job
必须实现Job接口,实现execute方法,该方法就是作业的执行逻辑

public class MyJob implements Job {
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        Date date = new  Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("今天值班的同学是瓶子 " + simpleDateFormat.format(date ));
    }
}

定义Trigger
为了方便,这里分别定义了两个方法获取SimpleTrigger和CronTrigger,getCronTrigger()中CronScheduleBuilder.cronSchedule("* 1 * * * ? “)的参数” 1 * * * ? *"是cron表达式,这里不展开描述,读者可以自行了解一下

public class MyTrigger  {
	//创建SimpleTrigger
    public static Trigger getSimpleTrigger(){
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2))
                .build();
        return trigger;
    }
	//创建CronTrigger
    public static Trigger getCronTrigger(){
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("* 1 * * * ? *"))
                .build();
        return trigger;
    }
}

编码Sechduler

public class MySchedulerExecute {
    public static  void main(String[] agrs) throws Exception{
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //调度器
        Scheduler scheduler = schedulerFactory.getScheduler();
        //触发器
        Trigger trigger = MyTrigger.getSimpleTrigger();
        //Trigger trigger = MyTrigger.getCronTrigger();
        /*
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2))
                .build();*/
        //任务
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).build();
        //将trigger和jobdetail进行关联
        scheduler.scheduleJob(jobDetail, trigger);
        //开启scheduler
        scheduler.start();
    }
}

Quartz还有很多优秀的特性值得我们去学习,很多新的作业调度框架底层都是经典的Quartz。以上只是简单的对Quartz的入门了解和应用,如有错误请批评指教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值