Quartz(石英框架)理论

基本概念

定义:任务调度开源框架

任务调度:

在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情。

  • 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。
  • 任务调度涉及多线程并发,线程池维护,运行时间规则解析,运行现场的保护以恢复等方面。

Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案。

Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述

任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义

触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能

调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行

实例:

1.导入坐标依赖:

 <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>1.8.3</version>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz-jobs</artifactId>
      <version>2.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.36</version>
    </dependency>

2.创建实现Job的实现类:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("TriggerName:"+jobExecutionContext.getTrigger().getName());
        System.out.println("TriggerTime:"+new Date());
        System.out.println("JobName:"+jobExecutionContext.getJobDetail().getName());
        System.out.println("妈妈喊你回家吃饭");
    }
}

3.具体开启任务调度:

//TODO:任务
        try {
            //1.定义任务对象
            JobDetail job = new JobDetail("task1","miaoGroup", MyJob.class);
            //2.创建SimpleTrigger触发器(间隔触发)
            SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1", "miaoTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
            //2.创建CronTrigger触发器(特定触发)
            CronTrigger cronTrigger = new CronTrigger("trigger1","miaoTrigger","0 58 10 ? * *");
            //3.创建调度器
            SchedulerFactory factory = new StdSchedulerFactory();
            Scheduler scheduler = factory.getScheduler();
            scheduler.scheduleJob(job,simpleTrigger);
            //4.启动调度器
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

SimpleTrigger: 定义间隔时间节点触发

CronTrigger: 定义特定时间节点触发

Cron表达式:由6~7个由空格分隔的时间元素组成。第7个元素可选。

位置 字段含义 范围 允许的特殊字符
1 0~59 *_/
2 分钟 0~59 *_/
3 小时 0~23 *_/
4 月份中哪一天 1~31 *_/?L
5 月份 1~12或JAN~DEC *_/
6 星期几 1~7或SUN~SAT * / ? L #
7 年份 1970~2099 * /

Cron表达式每个字段,都可以显式的规定一个值(如49),一个范围(1-6),一个列表(1,3,5)或者一个通配符(如*)

Cron表达式有几个特殊的字符,说明如下:

“-”:中划线,表示一个范围

“,”:使用逗号间隔的数据,表示一个列表

“*”:表示每一个值,它可以用于所有字段。例:在小时字段表示每小时

"?":该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值

“/”:通常表示为x/y,x为起始值,y表示值的增长

“L”:表示最后一天,仅在日期和星期字段中使用

“#“:只能用于”星期几“字段,表示这个月的第几个周几。例:”6#3“指这个月第三个周五

排除时间规则

可以使用Quartz提供的Calendar接口来实现,且Quartz提供了多种实现类来满足应用的需求

Calendar名称 作用
WeeklyCalendar 用于排除星期中的一天或多天
MonthlyCalendar 用于排除月份中的数天
AnnualCalendar 用于排除年中的一天或多天
HolidayCalendar 用于排除节假日

注:Calendar接口是quartz提供的,并非jdk中java.util包下的月历类

例:排除每周一的第一天

//TODO:任务
        try {
            //1.定义任务对象
            JobDetail job = new JobDetail("task1","miaoGroup", MyJob.class);
            //2.创建SimpleTrigger触发器(间隔触发)
//            SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1", "miaoTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
            //2.创建CronTrigger触发器(特定触发)
            CronTrigger cronTrigger = new CronTrigger("trigger1","miaoTrigger","0 32 11 ? * * ");
            //2.1排除
            AnnualCalendar annualCalendar = new AnnualCalendar();
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MONTH,1);
            calendar.set(Calendar.DATE,1);
            annualCalendar.setDayExcluded(calendar,true);
            //3.创建调度器
            SchedulerFactory factory = new StdSchedulerFactory();
            Scheduler scheduler = factory.getScheduler();
            scheduler.scheduleJob(job,cronTrigger);
            scheduler.addCalendar("exclued",annualCalendar,true,true);
            //4.启动调度器
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

猜你喜欢

转载自blog.csdn.net/qq_51404651/article/details/124792809