Quartz定时任务整理
阅读原文时间:2023年07月11日阅读:1

一、 介绍

Quartz是一个开源的定时任务调度框架,这里就不详细介绍了,我们直入主题
Quartz主要由三部分组成

  1. 任务:JobDetail
  2. 触发器:Trigger,(分两类:SimpleTrigger和常用的CronTrigger)
  3. 调度器:Scheduler

主要流程:比较简单: 先有JobDetail 装载定时任务类(需要实现Job接口),然后设置触发规则(如:cron表达式)来告知任务该按照什么样的规则执行,最后将两者放到调度器中,由调度器统一执行调度, 调度器主要是负责,任务的启动、暂停、恢复、修改、删除、添加等操作。

二、 代码

定时任务类:

import org.quartz.*;import java.time.LocalDateTime;

/** * @author guochunyun * @date 2019-12-18 下午 7:53 */public class HelloJop implements Job {    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        JobKey key = context.getJobDetail().getKey();        TriggerKey trkey = context.getTrigger().getKey();        System.out.println("jobDetail: " +  key.getName() + " : " + key.getGroup() + " trigger: " + trkey.getName() + " : " + trkey.getGroup());

        //获取jobDetail配置中自定义信息        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();        //获取Trigger配置中自定义信息        JobDataMap trDataMap = context.getTrigger().getJobDataMap();        System.out.println("jobDetail: " + jobDataMap.get("message") + " " + jobDataMap.get("floatJobValue") + "trigger: " + trDataMap.get("message") + " " + trDataMap.get("doubleTriggerValue"));

        System.out.println("============>  hello world!  " + LocalDateTime.now());    }}

配置类:

mport org.quartz.*;import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/** * @author guochunyun * @date 2019-12-18 下午 7:55 */public class HelloScheduler {

    public static void main(String[] args) throws SchedulerException {        //创建一个jobDetail实例,将该实例与HelloJob 绑定        JobDetail jobDetail = JobBuilder.newJob(HelloJop.class)                .withIdentity("myJob", "group")                //以下两个配置可以将自定义的map 传递到任务当中                .usingJobData("message", "hello myJob")                .usingJobData("floatJobValue", 3.14)                .build();

        //创建一个CronTrigger实例, 每隔五秒重复执行一次        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group")                //以下两个配置可以将自定义的map 传递到任务当中                .usingJobData("message", "hello myTrigger")                .usingJobData("doubleTriggerValue", 3.1415926D)                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))                .build();

        //创建Scheduler实例,        SchedulerFactory sfact = new StdSchedulerFactory();        Scheduler scheduler = sfact.getScheduler();

        //启动定时任务        scheduler.start();        scheduler.scheduleJob(jobDetail, trigger);

        //创建jobKey        JobKey jobKey = new JobKey("myJob", "group");        //创建TriggerKey        TriggerKey triggerKey = new TriggerKey("myTrigger", "group");

        try {            //todo  特别注意此暂停只是调用暂停方法之后,任务不在执行, 等到执行恢复函数的时候 暂停时间内的任务会一次性全执行            //15秒后暂停定时任务            Thread.sleep(15000);            scheduler.pauseJob(jobKey);            System.out.println("===================");

            //再等待15秒后开启定时任务            Thread.sleep(15000);            scheduler.resumeJob(jobKey);            System.out.println("==================");

            //修改定时任务            CronTrigger trigger1 = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group")                    .usingJobData("message", "hello myTrigger")                    .usingJobData("doubleTriggerValue", 3.1415926D)                    .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))                    .build();            Date date = scheduler.rescheduleJob(triggerKey, trigger1);            System.out.println("-----------------" + date);

        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

三、 我的组件

封装成springboot组件, 直接使用@QuartzJob注解并实现Job接口即可
组件地址

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章