zoukankan      html  css  js  c++  java
  • Quartz

    1 简介

    Quartz是一个完全由java编写的开源作业调度框架。

    通过触发器设置作业定时运行规则、控制作业的运行时间。

    Quartz定时器的作用很多,比如定时发送信息、定时器生成报表。

    2 核心组件

    2.1 Quartz框架的核心对象

    • Scheduler – 核心调度器

    • Job – 任务

    • JobDetail – 任务描述

    • Trigger -- 触发器


     

    Job是一个接口,借口中只有一个execute()方法,具体的任务类需要实现该接口的该方法。

    public interface Job {
       void execute(JobExecutionContext context)
           throws JobExecutionException;

    }

     


     

    2.2 对象之间的关系

    3 使用Quartz之前的准备

    3.1 建立一个Maven项目

    3.2 引入quartz依赖

    使用quartz,我们仅仅需要在maven的pom文件中添加依赖即可。我使用的是现在最新的一个版本2.3.0。

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

     

    4 编写第一个Quartz任务案例

    这个任务主要是每2秒打印一次HelloQuartz。

    先实现一下这个基本的Quartz的任务再来介绍一下Quartz的3个重要组成,JobDetail,Trigger,Scheduler。

    4.1 创建一个类HelloJob.java

    这个类是我们具体要实现的任务(打印Hello Quartz)

    package com.example;

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;

    import java.text.SimpleDateFormat;
    import java.util.Date;

    /**
    * @Auther: wuyilong
    * @Date: 2019/3/20 09:27
    * @Description: 打印Hello Quartz
    */
    public class HelloJob implements Job {
       
       @Override
       public void execute(JobExecutionContext context) throws JobExecutionException {
           Date date = new Date();
           SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           System.out.println(sf.format(date));
           // 具体的任务
           System.out.println("Hello Quartz");

      }
    }

    4.2 创建HelloScheduler.java,这个是具体触发我们的任务

    创建HelleScheduler的步骤:

    1. 创建调度工厂();    //工厂模式

    2. 根据工厂取得调度器实例();   //工厂模式

    3. Builder模式构建子组件<Job,Trigger>    // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder

    4. 通过调度器组装子组件 调度器.组装<子组件1,子组件2...>   //工厂模式

    5. 调度器.start();   //工厂模式


     

    public class HelloScheduler {
       
       public static void main(String[] args) throws SchedulerException {
           //创建一个jobDetail的实例,将该实例与HelloJob Class绑定
           JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
           //创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
           SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
           //创建schedule实例
           StdSchedulerFactory factory = new StdSchedulerFactory();
           Scheduler scheduler = factory.getScheduler();
           scheduler.start();
           scheduler.scheduleJob(jobDetail,trigger);

      }
    }

     

    5 cron表达式编写规则

    5.1 Quartz Cron 表达式支持7个域 ,分别是秒/分/时/日/月/周/年。

    名称是否必须允许值特殊字符
    0-59 , - * /
    0-59 , - * /
    0-23 , - * /
    1-31 , - * ? / L W C
    1-12 或 JAN-DEC , - * /
    1-7 或 SUN-SAT , - * ? / L C #
    空 或 1970-2099 , - * /

     

    5.2 官方的一些案例

    表示式说明
    0 0 12 * * ? 每天12点运行
    0 15 10 ? * * 每天10:15运行
    0 15 10 * * ? 每天10:15运行
    0 15 10 * * ? * 每天10:15运行
    0 15 10 * * ? 2008 在2008年的每天10:15运行
    0 * 14 * * ? 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
    0 0/5 14 * * ? 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
    0 0/5 14,18 * * ? 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
    0 0-5 14 * * ? 每天14:00点到14:05,每分钟运行一次。
    0 10,44 14 ? 3 WED 3月每周三的14:10分到14:44,每分钟运行一次。
    0 15 10 ? * MON-FRI 每周一,二,三,四,五的10:15分运行。
    0 15 10 15 * ? 每月15日10:15分运行。
    0 15 10 L * ? 每月最后一天10:15分运行。
    0 15 10 ? * 6L 每月最后一个星期五10:15分运行。
    0 15 10 ? * 6L 2007-2009 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
    0 15 10 ? * 6#3 每月第三个星期五的10:15分运行。

    6 SpringBoot2集成Quartz


    6.1 Maven文件

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

    6.2 编写任务类

    package com.example.task;

    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;

    /**
    * @Auther: wuyilong
    * @Date: 2019/3/20 10:32
    * @Description:
    */
    public class MjtTask extends QuartzJobBean {
       @Override
       protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
           System.out.println("开始定时计时");
      }
    }

    6.3 编写配置类

    package com.example.config;

    import com.example.task.MjtTask;
    import org.quartz.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    /**
    * @Auther: wuyilong
    * @Date: 2019/3/20 10:33
    * @Description:
    */
    @Configuration
    public class QuartzConfig {

       @Bean
       public JobDetail uploadTaskDetail() {
           return JobBuilder.newJob(MjtTask.class).withIdentity("mjtTask").storeDurably().build();
      }

       @Bean
       public Trigger uploadTaskTrigger() {
           CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
           return TriggerBuilder.newTrigger().forJob(uploadTaskDetail()).withIdentity("mjtTask")
                  .withSchedule(scheduleBuilder).build();
      }
    }

    6.4 运行结果

     

  • 相关阅读:
    编译安装LAMP之安装Apache+php与管理(十五)
    编译安装Mysql与管理(十四)
    linux服务器的性能分析与优化(十三)
    awk和sed (十二)
    Bash Shell (十一)
    linux 计划任务(十)
    Linux文本编辑器(九)
    linux rsync介绍(八)
    yum安装LAMP环境与管理(七)
    mysql date数据类型异常原因0000-00
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10563586.html
Copyright © 2011-2022 走看看