Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. Quartz
  3. 正文

定时任务之Quartz

2021年 9月 10日 1193点热度 0人点赞 2条评论

定时任务的实现方式有多种。早期没有定时任务框架的时候,我们会使用JDK中的Timer机制和多线程机制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执行某⼀段程序。后来有了定时任务框架,比如大名鼎鼎的Quartz任务调度框架,使用时间表达式(包括:秒、分、时、⽇、周、年)配置某⼀个任务什么时间去执行。

当下对于分布式的任务调度有很多解决方案,比较热门的就是Elastic-Job和XXL-JOB。以上两个产品也是基于Quartz框架做的。我们本篇文章主要讲解一下Quartz框架的简单使用,为自己封装自己的定时任务工具做一个敲门砖。

首先引入依赖:

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

开发一个任务调度器生产的方法:

// 创建作业任务调度器(类似于公交调度站)
public static Scheduler createScheduler() throws SchedulerException {
    SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    Scheduler scheduler = schedulerFactory.getScheduler();
    return scheduler;
}

开发一个定时触发器:

/**
  * 创建作业任务时间触发器(类似于公交车出⻋时间表)
  * cron表达式由七个位置组成,空格分隔
  * 1、Seconds(秒) 0~59
  * 2、Minutes(分) 0~59
  * 3、Hours(⼩时) 0~23
  * 4、Day of Month(天)1~31,注意有的月份不足31天
  * 5、Month(月) 0~11,或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
  * 6、Day of Week(周) 1~7,1=SUN或者 SUN,MON,TUE,WEB,THU,FRI,SAT
  * 7、Year(年)1970~2099 可选项
  * 示例:
  * 0 0 11 * * ? 每天的11点触发执行⼀次
  * 0 30 10 1 * ? 每⽉1号上午10点半触发执行⼀次
  */
public static Trigger createTrigger() {
    // 创建时间触发器,按日历调度
    CronTrigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("triggerName", "myTrigger")
            .startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? "))
            .build();
    // 创建触发器,按简单间隔调度
//    SimpleTrigger trigger1 = TriggerBuilder.newTrigger()
//            .withIdentity("triggerName", "myTrigger")
//            .startNow()
//            .withSchedule(SimpleScheduleBuilder
//                    .simpleSchedule()
//                    .withIntervalInSeconds(3)
//                    .repeatForever())
//            .build();
    return trigger;
}

我们开发一个自定义的Job,实现自定义的定时业务逻辑:

public class DemoJob implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("我是⼀个定时任务逻辑");
    }

}

接下来,开发我们的一个作业任务:

// 创建⼀个作业任务(类似于⼀辆公交车)
public static JobDetail createJob() {
    JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class);
    jobBuilder.withIdentity("jobName", "myJob");
    JobDetail jobDetail = jobBuilder.build();
    return jobDetail;
}

最后,创建一个测试方法来测试我们上述代码:

// 定时任务作业主调度程序
public static void main(String[] args) throws SchedulerException {
    // 创建⼀个作业任务调度器(类似于公交调度站)
    Scheduler scheduler = QuartzMain.createScheduler();
    // 创建⼀个作业任务(类似于⼀辆公交车)
    JobDetail job = QuartzMain.createJob();
    // 创建⼀个作业任务时间触发器(类似于公交车出车时间表)
    Trigger trigger = QuartzMain.createTrigger();
    // 使⽤调度器按照时间触发器执行这个作业任务
    scheduler.scheduleJob(job, trigger);
    scheduler.start();
}

执行结果如下:

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Quartz
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞

文章评论

  • yalong

    加油

    2021年 9月 13日
    回复
    • RubinChu

      @yalong hiahia

      2021年 9月 13日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复
    最新 热点 随机
    最新 热点 随机
    问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
    MyBatis之缓存 MySQL之Sharding-JDBC分布式事务 Kafka高级特性之物理存储 JVM之内存管理 SpringBoot之自定义Starter SpringMVC高级技术

    COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    京ICP备19039146号-1