zoukankan      html  css  js  c++  java
  • Quartz定时任务整理

    一、 介绍

    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接口即可
    组件地址

  • 相关阅读:
    17.1 Replication Configuration 复制配置
    用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
    用 Flask 来写个轻博客 (2) — Hello World!
    Mysql表分区的利弊
    用 Flask 来写个轻博客 (1) — 创建项目
    RPM方式安装MySQL5.6
    Chapter 17 Replication
    14.8.11 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
    14.8.9 Clustered and Secondary Indexes
    中小企业如何建立商业智能
  • 原文地址:https://www.cnblogs.com/chunyun/p/12208630.html
Copyright © 2011-2022 走看看