首页 > 其他 > 详细

quartz学习记录

时间:2020-01-14 16:12:11      阅读:68      评论:0      收藏:0      [点我收藏+]

maven

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

任务调度需求分析

1.基本需求

1) 可以定义触发的规则,比如基于时刻,时间间隔,表达式

2) 可以定义需要执行的任务。比如一个脚本或者一段代码。。。任务和规则是分开的

3) 集中管理配置爱,持久配置。

? 不把规则写在代码里面,可以看到所有的任务配置。方便维护

? 重启之后任务可以再次调度---配置在文件或者配置中心

4) 支持任务的串行执行

5) 支持多个任务并发执行,互不干扰

6)有自己的调度器,可以启动、中断、停止任务

7)容易集成到spring

2. 任务调度工具

  1. linux的crontab 执行简单的脚本命令
  2. JDK Timer(单线程) ScheduledThreadPool
  3. 容器 spring Task @Scheduled
  4. 分布式框架 XXL-JOB Elastic-Job

quartz优点

  • 精确到毫秒级别的调度
  • 可以独立运行,也可以集成到容器中
  • 支持事务
  • 支持集群
  • 支持持久化

quartz默认配置

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#

org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

第一个demo

1.创建job

public class MyTask1 implements Job {


    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("第一次测试quartz定时任务,当前时间: "+ TimeUtil.getCurrentTime());
    }
}

2.创建jobDetail任务信息

JobDetail jobDetail = JobBuilder.newJob(MyTask1.class)
    //name  group 构成唯一id
    .withIdentity("job1","group1")
    .usingJobData("abc","first value")
    .build();

3.创建trigger触发器

//创建trigger
Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1","group1")
    .startNow()
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                  //2秒执行一次
                  .withIntervalInSeconds(2)
                  //不停止
                  .repeatForever())
    .build();

4.创建Scheduler 调度器

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();

5.结构图

技术分享图片

trigger的四个实现类

实现类 描述 特点
CalendarIntervalTriggerImpl 基于日历的
CronTriggerImpl 基于cron表达式
DailyTimeIntervalTriggerImpl 基于日期的 每天的某个时段
SimpleTriggerImpl 简单触发器 固定时刻

1.SimpleTrigger

SimpleTrigger 可以定义固定时刻或者固定时间间隔的调度规则(精确到毫秒)。

例如:每天 9 点钟运行;每隔 30 分钟运行一次。

2.CalendarIntervalTrigger

CalendarIntervalTrigger 可以定义更多时间单位的调度需求,精确到秒。

好处是不需要去计算时间间隔,比如 1 个小时等于多少毫秒。

例如每年、每个月、每周、每天、每小时、每分钟、每秒。

每年的月数和每个月的天数不是固定的,这种情况也适用

3.DailyTimeIntervalTrigger

每天的某个时间段内,以一定的时间间隔执行任务。

例如:每天早上 9 点到晚上 9 点,每隔半个小时执行一次,并且只在周一到周六执 行。

4.CronTrigger

CronTirgger 可以定义基于 Cron 表达式的调度规则,是最常用的触发器类型

排除某些特定的时间

SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
scheduler.start();

AnnualCalendar holidays = new AnnualCalendar();

// 排除中秋节
Calendar midAutumn = new GregorianCalendar(2019, 9, 13);
holidays.setDayExcluded(midAutumn, true);
// 排除圣诞节
Calendar christmas = new GregorianCalendar(2019, 12, 25);
holidays.setDayExcluded(christmas, true);

// 调度器添加日历
scheduler.addCalendar("holidays", holidays, false, false);

JobDetail jobDetail = JobBuilder.newJob(MyTask1.class)
    .withIdentity("job1", "group1")
    .usingJobData("gupao","青山 2673")
    .build();

Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1", "group1")
    .startNow()
    .modifiedByCalendar("holidays")
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                  .withIntervalInSeconds(2)
                  .repeatForever())
    .build();

Date firstRunTime = scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + " 第一次触发: " + firstRunTime);
Calendar 名称 用法
BaseCalendar 为高级的 Calendar 实现了基本的功能,实现了 org.quartz.Calendar 接口AnnualCalendar 排除年中一天或多天
CronCalendar 日历的这种实现排除了由给定的 CronExpression 表达的时间集合。 例如,您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时 间(上午 8 点至下午 5 点)。 如果 CronTrigger 具有给定的 cron 表达式并 且与具有相同表达式的 CronCalendar 相关联,则日历将排除触发器包含的 所有时间,并且它们将彼此抵消
DailyCalendar 您可以使用此日历来排除营业时间(上午 8 点 - 5 点)每天。 每个DailyCalendar仅允许指定单个时间范围,并且该时间范围可能不会跨越每日边界(即,您不能指定从上午 8 点至凌晨 5 点的时间范围)。 如果属 性 invertTimeRange 为 false(默认),则时间范围定义触发器不允许触发 的时间范围。 如果 invertTimeRange 为 true,则时间范围被反转 - 也就是 排除在定义的时间范围之外的所有时间
HolidayCalendar 特别的用于从 Trigger 中排除节假日
MonthlyCalendar 排除月份中的指定数天,例如,可用于排除每月的最后一天
WeeklyCalendar 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日

Scheduler 调度器

Scheduler 中的方法主要分为三大类:

1)操作调度器本身,例如调度器的启动 start()、调度器的关闭 shutdown()。

2)操作 Trigger,例如 pauseTriggers()、resumeTrigger()。

3)操作 Job,例如 scheduleJob()、unscheduleJob()、rescheduleJob()

Listener

检测任务的生命周期

观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则 所有依赖它的对象都会得到通知并自动更新。

Quartz 中提供了三种 Listener,监听 Scheduler 的,监听 Trigger 的,监听 Job 的。

1. JobListener

2.TriggerListener

3.SchedulerListener

JobStore

Jobstore 用来存储任务和触发器相关的信息,例如所有任务的名称、数量、状态等 等。Quartz 中有两种存储任务的方式,一种在在内存,一种是在数据库。

RAMJobStore

把任务和触发器信息运行的信息 存储在内存中,用到了 HashMap、TreeSet、HashSet 等等数据结构。 如果程序崩溃或重启,所有存储在内存中的数据都会丢失。所以我们需要把这些数 据持久化到磁盘。

JDBCJobStore

JDBC 的实现方式有两种,JobStoreSupport 类的两个子类:

JobStoreTX:在独立的程序中使用,自己管理事务,不参与外部事务。

JobStoreCMT:(Container Managed Transactions (CMT),如果需要容器管理事 务时,使用它。

使用 JDBCJobSotre 时,需要配置数据库信息:

org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX 

org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate 

# 使用 quartz.properties,不使用默认配置 

org.quartz.jobStore.useProperties:true 

#数据库中 quartz 表的表名前缀 

org.quartz.jobStore.tablePrefix:QRTZ_ 

org.quartz.jobStore.dataSource:myDS 

#配置数据源 

org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver 

org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/gupao?useUnicode=true&characterEncoding=utf8 

org.quartz.dataSource.myDS.user:root 

org.quartz.dataSource.myDS.password:123456 

org.quartz.dataSource.myDS.validationQuery=select 0 from dual 

quartz学习记录

原文:https://www.cnblogs.com/dylan-thomas/p/12191781.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!