分布式之任务调度学习一

分布式之任务调度学习一官网 http www quartz scheduler org Quartz 的意思是石英 像石英表一样精确

大家好,欢迎来到IT知识分享网。

1 任务调度

1.1 什么时候需要任务调度?

1.1.1 任务调度的背景

1.2 任务调度需求分析

任务调度的实现方式有很多,如果要实现我们的调度需求,我们对这个工具有什么样的基本要求呢?

1.2.1 基本需求

1.3 任务调度工具对比

层次 举例 特点
操作系统 Linux crontab Windows 计划任务 只能执行简单脚本或者命令
数据库 MySql,Oracle 可以操作数据,不能执行Java代码
工具 Kettle 可以操作数据,执行脚本,没有集中配置
开发语言 JDK Timer,ScheduleThreadPool Timer:单线程,JDK1.5之后,ScheduleThreadPool(Cache,Fiexed,Single)没有集中配置,日程管理不够灵活
容器 Spring Task,@Scheduled 不支持集群
分布式框架 XXL-JOB,Elatic-Job

2 Quartz 基本介绍

3 Quartz Java 编程

3.1 引入依赖

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

3.2 默认配置文件

org.quartz.core 包下,有一个默认的配置文件,quartz.properties。当我们没有定义一个同名的配置文件的时候,就会使用默认配置文件里面的配置。

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 

3.3 创建 Job

实现唯一的方法 execute(),方法中的代码就是任务执行的内容。此处仅输出字符串。

public class MyJob implements Job { 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
    System.out.println("假发在哪里买的"); } } 
JobDetail jobDetail = JobBuilder.newJob(MyJob1.class) .withIdentity("job1", "group1") .usingJobData("gupao","2673") .usingJobData("moon",5.21F) .build(); 

3.4 创建 Trigger

在测试类 main()方法中,基于 SimpleTrigger 定义了一个每 2 秒钟运行一次、不断重复的 Trigger:

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

3.5 创建 Scheduler

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

注意这里,调度器一定是单例的。

3.6 体系结构总结

在这里插入图片描述

3.6.1 JobDetail

我们创建一个实现 Job 接口的类,使用 JobBuilder 包装成 JobDetail,它可以携带KV 的数据。

3.6.2 Trigger
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 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日
3.6.3 Scheduler
3.6.4 Listener
方法 作用或执行实际
getName() 返回 JobListener 的名称
jobToBeExecuted() Scheduler 在 JobDetail 将要被执行时调用这个方法
jobExecutionVetoed() Scheduler 在 JobDetail 即将被执行,但又被 TriggerListener 否决了时调用这个
方法
jobWasExecuted() Scheduler 在 JobDetail 被执行之后调用这个方法

在这里插入图片描述
TriggerListener

方法 作用或执行实际
getName() 返回监听器的名称
jtriggerFired() Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个
方法
vetoJobExecution() 在 Trigger 触 发 后 , Job 将 要 被 执 行 时 由 Scheduler 调 用 这 个 方 法 。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行
triggerMisfired() Trigger 错过触发时调用
triggerComplete() Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法
3.6.5 JobStore
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: org.quartz.dataSource.myDS.validationQuery=select 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112002.html

(0)
上一篇 2026-01-21 12:33
下一篇 2026-01-21 13:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信