网站备案到期了怎么办,网站开发的原理,重庆业务网站建设,app软件开发制作公司有哪些本文参考文章编写 Quartz
官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目#xff0c;是完全由 Java 开发的一个开源任务日程管理系统#xff0c;“任务进度管理器”就是一个在预先确定#xff08;被纳入日程#xff09;的时间到达时#xff… 本文参考文章编写 Quartz
官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目是完全由 Java 开发的一个开源任务日程管理系统“任务进度管理器”就是一个在预先确定被纳入日程的时间到达时负责执行或者通知其他软件组件的系统。 Quartz 是一个开源的作业调度框架它完全由 Java 写成并设计用于 J2SE 和 J2EE 应用中它提供了巨大的灵活性而不牺牲简单性 应用场景
在日常的开发过程中简单的定时任务比如每天凌晨对数据进行备份这样的场景我们使用 Spring 提供的注解 Schedule 就可以满足业务但是对于一些复杂的任务调度场景比如日程提醒从日程中取消开始停止暂停日程进度这样复杂一些的场景Schedule就无法满足了此时就需要用到Quartz 它可以持久性作业即保持调度定时的状态 作业管理 即对调度作业进行有效的管理
组成部分 SchedulerQuartz 中的任务调度器通过 Trigger(触发器) 和 JobDetail(任务详情) 可以用来调度、暂停和删除任务。调度器就相当于一个容器装载着任务和触发器该类是一个接口代表一个 Quartz 的独立运行容器Trigger(触发器) 和 JobDetail(任务详情) 可以注册到 Scheduler 中这样当Trigger(触发器)被触发时对应的Job就会执行,两者在 Scheduler 中拥有各自的组及名称组及名称是 Scheduler 查找定位容器中某一对象的依据Trigger(触发器) 的组及名称必须唯一JobDetail(任务详情) 的组和名称也必须唯一但二者的组名称可以一致因为它们是不同类型的TriggerQuartz 中的触发器是一个类描述触发 Job(任务) 执行的时间触发规则主要有 SimpleTrigger 和 CronTrigger这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度SimpleTrigger 是最适合的选择而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案如工作日周一到周五的 1500 ~ 1600 执行调度等JobDetailQuartz 中需要执行的任务详情包括了任务的唯一标识和具体要执行的任务可以通过 JobDataMap 往任务中传递数据JobDetail绑定指定的Job每次Scheduler调度执行一个Job的时候首先会拿到对应的Job然后创建该Job实例再去执行Job中的execute()的内容任务执行结束后关联的Job对象实例会被释放且会被JVM GC清除JobQuartz 中具体的任务包含了执行任务的具体方法。是一个接口只定义一个方法execute()方法在实现接口的 execute() 方法中编写业务逻辑JobExecutionContext:JobExecutionContext中包含了Quartz运行时的环境以及Job本身的详细数据信息。当Schedule调度执行一个Job的时候就会将JobExecutionContext传递给该Job的execute()中Job就可以通过JobExecutionContext对象获取信息。
Cron 表达式
Cron表达式在线生成 Cron 表达式是一个字符串包括 6~7 个时间元素在 Quartz 中可以用于指定任务的执行时间 Cron 语法
秒 分 小时 日 月 周 年例
0/2 * * * * ? 表示每2秒 执行任务
0 0/2 * * * ? 表示每2分钟 执行任务时间元素可出现的字符有效数值范围秒, - * /0-59分, - * /0-59小时, - * /0-23日, - * / ? L W0-31月, - * /1-12周, - * / ? L #1-7或SUN-SAT年, - * /当前年份-大于等于当前年份例2023-2024
Cron 语法中特殊字符说明
字符作用举例,列出枚举值在分钟域使用5,10表示在5分和10分各触发一次-表示触发范围在分钟域使用5-10表示从5分到10分钟每分钟触发一次*匹配任意值在分钟域使用*, 表示每分钟都会触发一次/起始时间开始触发每隔固定时间触发一次在分钟域使用5/10,表示5分时触发一次每10分钟再触发一次?在日和周中用于匹配任意值在日域使用?,表示每天都触发一次#在周中确定第几周星期几1#2 表示第1周 的星期2L表示最后在周中4L表示本月最后一个星期4W表示有效工作日(周一到周五)2W,表示每月 2号最近的那个工作日
Quartz基于数据库存储任务信息 为了保证可以动态的添加删除任务Quartz 存储任务信息有两种方式使用内存或者使用数据库来存储 数据库SQL脚本官网下载地址 解压下载后的quartz-2.3.0-distribution.tar.gz文件在quartz-2.3.0-distribution\quartz-2.3.0-SNAPSHOT\src\org\quartz\impl\jdbcjobstore目录下得到各类型数据库的SQL脚本 Quartz 目前支持的数据库 cloudscape数据库一个以 Java 类库形式提供的、轻量级的、可嵌入的关系引擎。与其他的关系数据库系统类似。Cloudscape 也有事务提交和回滚并提供了崩溃恢复。与其他数据库一样它允许多个线程共享同一连接 cubrid数据库是一个全面开源且完全免费的关系数据库管理系统 db2数据库:DB2就是IBM开发的一种大型关系型数据库平台 derby数据库一个完全用java编写的数据库非常小巧既可以做为单独的数据库服务器使用也可以内嵌在应用程序中使用 firebird数据库:一个真正的关系数据库支持存储过程、视图、触发器、事务等大型关系数据库的所有特性 h2数据库h2是一个开源的、纯java实现的关系数据库。支持网络版和嵌入式版本另外还提供了内存版,支持相当标准的sql标准,提供了非常友好的基于web的数据库管理界面 hsqldb数据库:一个开放源代码的JAVA数据库其具有标准的SQL语法和JAVA接口 informix数据库:是IBM公司出品的关系数据库管理系统RDBMS家族。作为一个集成解决方案它被定位为作为IBM在线事务处理OLTP旗舰级数据服务系统 mysql数据库一个关系型数据库管理系统由瑞典MySQL AB 公司开发是最流行的关系型数据库管理系统之一 oracle数据库:是甲骨文公司的一款关系数据库管理系统。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。 pointbase数据库:是由oracle的创始人之一的Bruce Scott开发的一套小型数据库。 postgresql数据库:是一种特性非常齐全的自由软件的对象-关系型数据库管理系统 sapdb数据库:sapdb是SAP公司开发的开源数据库结构和Oracle非常近似 solid数据库:solid数据库是一款“轻量级”的数据库是标准的 关系型数据库支持 SQL / ACID / 事务隔离级别等标准也支持存储过程、 触发器、事件等。 SQL Server数据库:美国Microsoft公司推出的一种关系型数据库系统。支持对称多处理器结构、存储过程、ODBC并具有自主的SQL语言 sybase数据库:美国Sybase公司研制的一种关系型数据库系统是一种典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统。 使用脚本tables_mysql.sql创建的表概述(此处字段中的注释为后续补充官网脚本并未提供)
1.qrtz_blob_triggers表自定义的triggers使用blog类型进行存储非自定义的triggers不会存放在此表中Quartz提供的triggers包括CronTriggerCalendarIntervalTriggerDailyTimeIntervalTrigger以及SimpleTrigger这几个trigger信息会保存在后面的几张表中
CREATE TABLE qrtz_blob_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称qrtz_triggers表trigger_name的外键,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器群组qrtz_triggers表trigger_group的外键,BLOB_DATA blob NULL COMMENT 任务信息存放持久化job对象,PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) USING BTREE,CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) REFERENCES qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型JobStore 并不知道如何存储实例的时候) ROW_FORMAT Dynamic;
2.qrtz_calendars表Quartz为我们提供了日历的功能可以自己定义一个时间段可以控制触发器在这个时间段内触发或者不触发现在提供6种类型AnnualCalendarCronCalendarDailyCalendarHolidayCalendarMonthlyCalendarWeeklyCalendar
CREATE TABLE qrtz_calendars (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,CALENDAR_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称,CALENDAR blob NOT NULL COMMENT 日历信息存放持久化calendar对象,PRIMARY KEY (SCHED_NAME, CALENDAR_NAME) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 以 Blob 类型存储存放日历信息 quartz可配置一个日历来指定一个时间范围。 ROW_FORMAT Dynamic;
3.qrtz_cron_triggers表存放cron类型的触发器
CREATE TABLE qrtz_cron_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称qrtz_triggers表trigger_name的外键,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器组名称qrtz_triggers表trigger_group的外键,CRON_EXPRESSION varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT cron表达式,TIME_ZONE_ID varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 时区,PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) USING BTREE,CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) REFERENCES qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储触发器的cron表达式 ROW_FORMAT Dynamic;
4.qrtz_fired_triggers表存储已经触发的trigger相关信息trigger随着时间的推移状态发生变化直到最后trigger执行完成从表中被删除
CREATE TABLE qrtz_fired_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,ENTRY_ID varchar(95) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器实例id,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称qrtz_triggers表trigger_name的外键,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器组qrtz_triggers表trigger_group的外键,INSTANCE_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器实例名,FIRED_TIME bigint(13) NOT NULL COMMENT 触发时间,SCHED_TIME bigint(13) NOT NULL COMMENT 定时器制定的时间,PRIORITY int(11) NOT NULL COMMENT 优先级,STATE varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 状态,JOB_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 集群中job的名字,该名字用户自己可以随意定制,无强行要求,JOB_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 集群中job的所属组的名字,该名字用户自己随意定制,无强行要求,IS_NONCONCURRENT varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 是否并发,REQUESTS_RECOVERY varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 是否接受恢复执行默认为false设置了RequestsRecovery为true则会被重新执行,PRIMARY KEY (SCHED_NAME, ENTRY_ID) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储与已触发的 Trigger 相关的状态信息以及相联 Job 的执行信息。 ROW_FORMAT Dynamic;
5.qrtz_job_details表存储jobDetails信息相关信息在定义的时候指定
CREATE TABLE qrtz_job_details (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,JOB_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 任务名称,JOB_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 任务群组,DESCRIPTION varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 关于任务的说明,JOB_CLASS_NAME varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 任务class全路径quartz就是根据这个路径到classpath找到该job类,IS_DURABLE varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 是否为持久把该属性设置为1quartz会把job持久化到数据库中,IS_NONCONCURRENT varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 是否并发,IS_UPDATE_DATA varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 是否更新数据,REQUESTS_RECOVERY varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 是否接受恢复执行默认为false设置了RequestsRecovery为true则该job会被重新执行,JOB_DATA blob NULL COMMENT 任务信息存放持久化job对象,PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储每一个已配置的 jobDetail 的详细信息 ROW_FORMAT Dynamic;6.qrtz_locks表Quartz提供的锁表存储程序的悲观锁的信息(假如使用了悲观锁)为多个节点调度提供分布式锁实现分布式调度默认有2个锁 STATE_ACCESS主要用在scheduler定期检查是否失效的时候保证只有一个节点去处理已经失效的scheduler TRIGGER_ACCESS主要用在TRIGGER被调度的时候保证只有一个节点去执行调度
CREATE TABLE qrtz_locks (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,LOCK_NAME varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 悲观锁名称,PRIMARY KEY (SCHED_NAME, LOCK_NAME) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储程序的悲观锁的信息(假如使用了悲观锁) ROW_FORMAT Dynamic;
7.qrtz_paused_trigger_grps表存放暂停掉的触发器
CREATE TABLE qrtz_paused_trigger_grps (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器组qrtz_triggers表trigger_group的外键,PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储已暂停的 Trigger 组的信息 ROW_FORMAT Dynamic;
8.qrtz_scheduler_state表存储所有节点的scheduler会定期检查scheduler是否失效记录了最后最新的检查时间在quartz.properties中设置了CHECKIN_INTERVAL为1000也就是每秒检查一次
CREATE TABLE qrtz_scheduler_state (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,INSTANCE_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 实例名称配置文件中org.quartz.scheduler.instanceId配置的名字会写入该字段,LAST_CHECKIN_TIME bigint(13) NOT NULL COMMENT 上次检查时间,CHECKIN_INTERVAL bigint(13) NOT NULL COMMENT 检查间隔时间,PRIMARY KEY (SCHED_NAME, INSTANCE_NAME) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储集群中note实例信息quartz会定时读取该表的信息判断集群中每个实例的当前状态 ROW_FORMAT Dynamic;
9.qrtz_simple_triggers表存储简单的触发器信息包括重复次数间隔以及已触的次数
CREATE TABLE qrtz_simple_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称qrtz_triggers表trigger_ name的外键,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器组qrtz_triggers表trigger_group的外键,REPEAT_COUNT bigint(7) NOT NULL COMMENT 重复的次数统计,REPEAT_INTERVAL bigint(12) NOT NULL COMMENT 重复的间隔时间,TIMES_TRIGGERED bigint(10) NOT NULL COMMENT 已经触发的次数,PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) USING BTREE,CONSTRAINT qrtz_simple_triggers_ibfk_1 FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) REFERENCES qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储简单的 Trigger包括重复次数间隔以及已触发的次数。 ROW_FORMAT Dynamic;
10.qrtz_simprop_triggers表存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器
CREATE TABLE qrtz_simprop_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称qrtz_triggers表trigger_ name的外键,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器群组qrtz_triggers表trigger_group的外键,STR_PROP_1 varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT String类型的trigger的第一个参数,STR_PROP_2 varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT String类型的trigger的第二个参数,STR_PROP_3 varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT String类型的trigger的第三个参数,INT_PROP_1 int(11) NULL DEFAULT NULL COMMENT int类型的trigger的第一个参数,INT_PROP_2 int(11) NULL DEFAULT NULL COMMENT int类型的trigger的第二个参数,LONG_PROP_1 bigint(20) NULL DEFAULT NULL COMMENT long类型的trigger的第一个参数,LONG_PROP_2 bigint(20) NULL DEFAULT NULL COMMENT long类型的trigger的第二个参数,DEC_PROP_1 decimal(13, 4) NULL DEFAULT NULL COMMENT decimal类型的trigger的第一个参数,DEC_PROP_2 decimal(13, 4) NULL DEFAULT NULL COMMENT decimal类型的trigger的第二个参数,BOOL_PROP_1 varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT Boolean类型的trigger的第一个参数,BOOL_PROP_2 varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT Boolean类型的trigger的第二个参数,PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) USING BTREE,CONSTRAINT qrtz_simprop_triggers_ibfk_1 FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) REFERENCES qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储CalendarIntervalTrigger和DailyTimeIntervalTrigger ROW_FORMAT Dynamic;
11.qrtz_triggers表存储已配置的 Trigger 的信息一个Job可以被多个Trigger绑定但是一个Trigger只能绑定一个Job
CREATE TABLE qrtz_triggers (SCHED_NAME varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 调度器名称,TRIGGER_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器名称,TRIGGER_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器组名称,JOB_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 任务名称qrtz_job_details表job_name的外键,JOB_GROUP varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 任务群组qrtz_job_details表job_group的外键,DESCRIPTION varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 关于触发器的说明信息,NEXT_FIRE_TIME bigint(13) NULL DEFAULT NULL COMMENT 下次执行时间默认为-1意味不会自动触发,PREV_FIRE_TIME bigint(13) NULL DEFAULT NULL COMMENT 上次执行时间毫秒,PRIORITY int(11) NULL DEFAULT NULL COMMENT 线程优先级,TRIGGER_STATE varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 当前触发器状态WAITING-等待 PAUSED-暂停ACQUIRED-正常执行 BLOCKED-阻塞 ERROR-错误,TRIGGER_TYPE varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 触发器类型使用cron表达式,START_TIME bigint(13) NOT NULL COMMENT 开始时间,END_TIME bigint(13) NULL DEFAULT NULL COMMENT 结束时间,CALENDAR_NAME varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 日程表名称表qrtz_calendars的calendar_name字段外键,MISFIRE_INSTR smallint(2) NULL DEFAULT NULL COMMENT misfire处理规则,1代表【以当前时间为触发频率立刻触发一次然后按照Cron频率依次执行】,\n 2代表【不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行】,\n -1代表【以错过的第一个频率时间立刻开始执行,重做错过的所有频率周期后当下一次触发频率发生时间大于当前时间后再按照正常的Cron频率依次执行,JOB_DATA blob NULL COMMENT 任务信息存放持久化job对象,PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) USING BTREE,INDEX SCHED_NAME(SCHED_NAME, JOB_NAME, JOB_GROUP) USING BTREE,CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) REFERENCES qrtz_job_details (SCHED_NAME, JOB_NAME, JOB_GROUP) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 存储已配置的触发器 的信息 ROW_FORMAT Dynamic;
SpringBoot整合Quartz
创建数据库test_quartz将tables_mysql.sql导入并运行导入Maven依赖这里使用 druid 作为数据库连接池Quartz 默认使用 c3p0 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- quartz --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactIdversion2.3.5.RELEASE/version/dependency!--druid连接池--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version/dependency!-- mybatis-plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3.4/version/dependency!--胡图工具包--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.2/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies
新建配置文件quartz.properties 默认情况下Quartz 会加载 classpath 下的 quartz.properties 作为配置文件。如果找不到则会使用 quartz 框架自己 jar 包下 org/quartz 底下的 quartz.properties 文件 quartz.properties
#定时任务实例的id 默认自动
org.quartz.scheduler.instanceIdAUTO
# 定时任务的线程名,相同集群实例名称必须相同
org.quartz.scheduler.instanceNameDefaultQuartzScheduler
#如果您希望Quartz Scheduler通过RMI作为服务器导出本身则将“rmi.export”标志设置为true
#在同一个配置文件中为org.quartz.scheduler.rmi.export和org.quartz.scheduler.rmi.proxy指定一个true值是没有意义的,如果你这样做export选项将被忽略
org.quartz.scheduler.rmi.exportfalse
#如果要连接使用远程服务的调度程序则将“org.quartz.scheduler.rmi.proxy”标志设置为true。您还必须指定RMI注册表进程的主机和端口 - 通常是“localhost”端口1099
org.quartz.scheduler.rmi.proxyfalse
#如果想使用Quartz在执行一个job前使用UserTransaction则应该设置该属性为true。job执行完、在JobDataMap改变之后事务会提交。默认值是false。 可以在你的job类中使用 ExecuteInJTATransaction注解, 可以控制job是否使用事务。
org.quartz.scheduler.wrapJobExecutionInUserTransactionfalse#实例化ThreadPool时使用的线程类为SimpleThreadPool
org.quartz.threadPool.classorg.quartz.simpl.SimpleThreadPool
#threadCount和threadPriority将以setter的形式注入ThreadPool实例
#并发个数 如果你只有几个工作每天触发几次 那么1个线程就可以,如果你有成千上万的工作每分钟都有很多工作 那么久需要50-100之间.
#只有1到100之间的数字是非常实用的
org.quartz.threadPool.threadCount5
#优先级 默认值为5
org.quartz.threadPool.threadPriority5
#可以是“true”或“false”默认为false
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThreadtrue#在被认为“misfired”(失火)之前调度程序将“tolerate(容忍)”一个Triggers(触发器)将其下一个启动时间通过的毫秒数。默认值如果您在配置中未输入此属性为6000060秒
org.quartz.jobStore.misfireThreshold5000
# 默认存储在内存中,RAMJobStore快速轻便但是当进程终止时所有调度信息都会丢失
#org.quartz.jobStore.classorg.quartz.simpl.RAMJobStore#持久化方式默认存储在内存中此处使用数据库方式
org.quartz.jobStore.classorg.quartz.impl.jdbcjobstore.JobStoreTX
#您需要为JobStore选择一个DriverDelegate才能使用。DriverDelegate负责执行特定数据库可能需要的任何JDBC工作
# StdJDBCDelegate是一个使用“vanilla”JDBC代码和SQL语句来执行其工作的委托,用于完全符合JDBC的驱动程序
org.quartz.jobStore.driverDelegateClassorg.quartz.impl.jdbcjobstore.StdJDBCDelegate
#可以将“org.quartz.jobStore.useProperties”配置参数设置为“true”默认为false以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串
#因此可以作为名称 - 值对存储而不是在BLOB列中以其序列化形式存储更多复杂的对象。从长远来看这是更安全的因为您避免了将非String类序列化为BLOB的类版本问题
org.quartz.jobStore.usePropertiestrue
#表前缀
org.quartz.jobStore.tablePrefixqrtz_
#数据源别名自定义
org.quartz.jobStore.dataSourceqzDS#使用阿里的druid作为数据库连接池
org.quartz.dataSource.qzDS.connectionProvider.classcom.wf.test_quartz_demo.config.DruidPoolingConnectionProvider
org.quartz.dataSource.qzDS.URLjdbc:mysql://127.0.0.1:3306/test_quartz?characterEncodingutf8useSSLfalseautoReconnecttrueserverTimezoneUTC
org.quartz.dataSource.qzDS.userroot
org.quartz.dataSource.qzDS.passwordroot
org.quartz.dataSource.qzDS.drivercom.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.maxConnections10
#设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表则此属性必须设置为“true”否则您将遇到破坏
#org.quartz.jobStore.isClusteredfalse
注以上配置中需要修改的地方有 org.quartz.dataSource.qzDS.connectionProvider.class这是druid连接池的配置类需要修改为自己的路径 org.quartz.dataSource.qzDS.URL:需要修改为自己的数据库连接 org.quartz.dataSource.qzDS.user:需要修改为自己的数据库用户名 org.quartz.dataSource.qzDS.password需要修改为自己的数据库密码
application.properties:
server.port8081
# mysql配置
spring.datasource.druid.driver-class-namecom.mysql.jdbc.Driver
spring.datasource.typecom.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.urljdbc:mysql://127.0.0.1:3306/test_quartz?characterEncodingutf8useSSLfalseautoReconnecttrueserverTimezoneUTC
spring.datasource.druid.usernameroot
spring.datasource.druid.passwordroot
#连接池初始化大小最小最大
spring.datasource.druid.initial-size3
spring.datasource.druid.min-idle3
spring.datasource.druid.max-active10
#连接池最大等待时间
spring.datasource.druid.max-wait60000
# mybatis-plus配置
mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.mapper-locationsclasspath*:/mapper/*.xml
mybatis-plus.type-aliases-packagecom.wf.test_quartz_demo.bean
编写Quartz配置类
package com.wf.test_quartz_demo.config;import com.sun.istack.internal.NotNull;
import org.quartz.Scheduler;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;import java.io.IOException;
import java.util.Properties;/*** Description: quartz 配置类*/
Configuration
public class QuartzConfig implements SchedulerFactoryBeanCustomizer {Beanpublic Properties properties() throws IOException {PropertiesFactoryBean propertiesFactoryBean new PropertiesFactoryBean();// 对quartz.properties文件进行读取propertiesFactoryBean.setLocation(new ClassPathResource(/quartz.properties));// 在quartz.properties中的属性被读取并注入后再初始化对象propertiesFactoryBean.afterPropertiesSet();return propertiesFactoryBean.getObject();}Beanpublic SchedulerFactoryBean schedulerFactoryBean() throws IOException {SchedulerFactoryBean schedulerFactoryBean new SchedulerFactoryBean();schedulerFactoryBean.setQuartzProperties(properties());return schedulerFactoryBean;}/** 通过SchedulerFactoryBean获取Scheduler的实例*/Beanpublic Scheduler scheduler() throws IOException {return schedulerFactoryBean().getScheduler();}/*** 使用阿里的druid作为数据库连接池*/Overridepublic void customize(NotNull SchedulerFactoryBean schedulerFactoryBean) {schedulerFactoryBean.setStartupDelay(2);schedulerFactoryBean.setAutoStartup(true);schedulerFactoryBean.setOverwriteExistingJobs(true);}}
编写连接池配置类
package com.wf.test_quartz_demo.config;import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.quartz.SchedulerException;
import org.quartz.utils.ConnectionProvider;import java.sql.Connection;
import java.sql.SQLException;/*** Description: druid连接池配置*/
Data
public class DruidPoolingConnectionProvider implements ConnectionProvider {// JDBC驱动public String driver;// JDBC连接串public String URL;// 数据库用户名public String user;// 数据库用户密码public String password;// 数据库最大连接数public int maxConnections;// 数据库SQL查询每次连接返回执行到连接池以确保它仍然是有效的。public String validationQuery;private boolean validateOnCheckout;private int idleConnectionValidationSeconds;public String maxCachedStatementsPerConnection;private String discardIdleConnectionsSeconds;public static final int DEFAULT_DB_MAX_CONNECTIONS 10;public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION 120;// Druid连接池private DruidDataSource datasource;Overridepublic Connection getConnection() throws SQLException {return datasource.getConnection();}Overridepublic void shutdown() {datasource.close();}Overridepublic void initialize() throws SQLException {if (this.URL null) {throw new SQLException(DBPool could not be created: DB URL cannot be null);}if (this.driver null) {throw new SQLException(DBPool driver could not be created: DB driver class name cannot be null!);}if (this.maxConnections 0) {throw new SQLException(DBPool maxConnections could not be created: Max connections must be greater than zero!);}datasource new DruidDataSource();try{datasource.setDriverClassName(this.driver);} catch (Exception e) {try {throw new SchedulerException(Problem setting driver class name on datasource: e.getMessage(), e);} catch (SchedulerException ignored) {}}datasource.setUrl(this.URL);datasource.setUsername(this.user);datasource.setPassword(this.password);datasource.setMaxActive(this.maxConnections);datasource.setMinIdle(1);datasource.setMaxWait(0);datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS);if (this.validationQuery ! null) {datasource.setValidationQuery(this.validationQuery);if(!this.validateOnCheckout)datasource.setTestOnReturn(true);elsedatasource.setTestOnBorrow(true);datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);}}
}
编写实体类
CodeEnum:用于响应状态码
package com.wf.test_quartz_demo.bean;/*** 状态码枚举*/
public enum CodeEnum {/**操作成功**/SUCCESS(200,操作成功),/**服务调用异常**/SERVICE_CALL_EXCEPTION(400,服务调用异常),/**操作失败**/ERROR(500,操作失败),/**参数不合法**/ILLEGAL_PARAMETER(5001,参数不合法),/**验证码已失效**/VERIFICATION_CODE_FAILURE(5002,验证码已失效),/**用户昵称重复**/DUPLICATE_NICKNAME(5003,用户昵称重复),/**用户名或密码错误**/LOGIN_FAILED(5004,用户名或密码错误),/**文件上传失败**/FILE_UPLOAD_FAILED(5005,文件上传失败),/**资源不存在*/RESOURCE_DOES_NOT_EXIST(5006,资源不存在),/** 当前项目已存在该用户*/DUPLICATE_USER(5007,用户重复入项),/**无效签名**/JWT_INVALID(2001,无效签名),/**token过期**/JWT_OVERDUE(2002,token过期),/**token算法不一致**/JWT_ALGORITHM_INCONSISTENCY(2003,token算法不一致),/**token失效**/JWT_LOSE_EFFECT(2004,token失效),/**非法请求**/ILLEGAL_REQUEST(2005,非法请求,请求来源不合法);/*** 自定义状态码**/private Integer code;/**自定义描述**/private String message;CodeEnum(Integer code, String message){this.code code;this.message message;}public Integer getCode() {return code;}public String getMessage() {return message;}
}
CommonResult:响应数据结构
package com.wf.test_quartz_demo.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 请求信息类用于返回请求是否成功* param T*/
Data
AllArgsConstructor
NoArgsConstructor
public class CommonResultT{/*** 响应状态码*/private int code;/*** 响应结果描述*/private String message;/*** 返回的数据*/private T data;/*** 成功返回* param data* param T* return*/public static T CommonResultT success(T data) {CommonResultT response new CommonResult();response.setCode(CodeEnum.SUCCESS.getCode());response.setMessage(CodeEnum.SUCCESS.getMessage());response.setData(data);return response;}/*** 失败返回,自定义code* param code* param message* param T* return*/public static T CommonResultT fail(Integer code, String message) {CommonResultT response new CommonResult();response.setCode(code);response.setMessage(message);return response;}/*** 失败返回* param codeEnum* param T* return*/public static T CommonResultT fail(CodeEnum codeEnum) {CommonResultT response new CommonResult();response.setCode(codeEnum.getCode());response.setMessage(codeEnum.getMessage());return response;}/*** 失败返回* param message* param T* return*/public static T CommonResultT fail(String message) {CommonResultT response new CommonResult();response.setCode(CodeEnum.ERROR.getCode());response.setMessage(message);return response;}}
QuartzJobVO任务信息VO
package com.wf.test_quartz_demo.bean;import lombok.Data;
import java.math.BigInteger;/*** Description: 定时任务信息*/
Data
public class QuartzJobVO {private String schedName;private String jobName;private String jobGroup;private String description;private String jobClassName;private BigInteger nextFireTime;private BigInteger startTime;private String triggerState;private String cronExpression;
}
RecordsParam:接口请求参数
package com.wf.test_quartz_demo.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.quartz.JobDataMap;/*** 记录查询参数*/
Data
AllArgsConstructor
NoArgsConstructor
public class RecordsParam {/*** 分页页码*/private Integer page 1;/*** 单页展示条数*/private Integer size 10;/*** 任务名称*/private String jobName;/*** 任务组名称*/private String jobGroupName;/*** 触发器名称*/private String triggerName;/*** 触发器组名称*/private String triggerGroupName;/*** corn表达式*/private String corn;/*** 实际执行业务逻辑的job路径*/private String classPath;/*** 需要向job传递的参数*/private JobDataMap jobDataMap;/*** 备注*/private String remarks;/*** 分页起始页*/private Integer pageIndex;}
编写Mapper.xml
QuartzJobInfoMapper.xml:
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.wf.test_quartz_demo.mapper.QuartzJobInfoMapper!-- 查询任务信息列表--select idgetJobAndTriggerDetails resultTypeQuartzJobVO parameterTypeRecordsParamSELECTtqjd.SCHED_NAME as schedName,tqjd.JOB_NAME as jobName,tqjd.JOB_GROUP as jobGroup,tqjd.DESCRIPTION as description,tqjd.JOB_CLASS_NAME as jobClassName,tqt.NEXT_FIRE_TIME as nextFireTime,tqt.START_TIME as startTime,tqt.TRIGGER_STATE as triggerState,tqct.CRON_EXPRESSION as cronExpressionFROMqrtz_job_details tqjdLEFT JOIN qrtz_triggers tqt ON tqjd.SCHED_NAME tqt.SCHED_NAMEAND tqjd.JOB_NAME tqt.JOB_NAMEAND tqjd.JOB_GROUP tqt.JOB_GROUPLEFT JOIN qrtz_cron_triggers tqct ON tqt.SCHED_NAME tqct.SCHED_NAMEAND tqt.TRIGGER_NAME tqct.TRIGGER_NAMEAND tqt.TRIGGER_GROUP tqct.TRIGGER_GROUPWHEREtqt.TRIGGER_TYPE CRONif testpageIndex !nullLIMIT #{pageIndex},#{size}/if/select/mapper
编写Mapper接口
QuartzJobInfoMapper
package com.wf.test_quartz_demo.mapper;import com.wf.test_quartz_demo.bean.QuartzJobVO;
import com.wf.test_quartz_demo.bean.RecordsParam;
import org.springframework.stereotype.Repository;import java.util.List;Repository
public interface QuartzJobInfoMapper {/*** 查询任务列表* param param* return*/ListQuartzJobVO getJobAndTriggerDetails(RecordsParam param);}
编写Service接口及实现类
TestQuartzJobInfoService
package com.wf.test_quartz_demo.service;import java.util.List;import com.wf.test_quartz_demo.bean.CommonResult;
import com.wf.test_quartz_demo.bean.QuartzJobVO;
import com.wf.test_quartz_demo.bean.RecordsParam;/*** Description: 定时任务*/
public interface TestQuartzJobInfoService {CommonResultString addJob(RecordsParam param);CommonResultString pauseJob(RecordsParam param);CommonResultString resumeJob(RecordsParam param);CommonResultString updateJob(RecordsParam param);CommonResultString deleteJob(RecordsParam param);CommonResultListQuartzJobVO getJobAndTriggerDetails(RecordsParam param);
}
TestQuartzJobServiceImpl
package com.wf.test_quartz_demo.service.impl;import com.wf.test_quartz_demo.bean.CodeEnum;
import com.wf.test_quartz_demo.bean.CommonResult;
import com.wf.test_quartz_demo.bean.QuartzJobVO;
import com.wf.test_quartz_demo.bean.RecordsParam;
import com.wf.test_quartz_demo.mapper.QuartzJobInfoMapper;
import com.wf.test_quartz_demo.service.TestQuartzJobInfoService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.List;/*** Description: 任务调度测试service*/
Slf4j
Service
public class TestQuartzJobServiceImpl implements TestQuartzJobInfoService {Resourceprivate QuartzJobInfoMapper quartzJobMapper;Resourceprivate Scheduler scheduler;/*** 添加任务* param param* return*/Overridepublic CommonResultString addJob(RecordsParam param) {try {if(param!null){//动态控制job,根据job的类路径创建JobDetailClass clsss Class.forName(param.getClassPath());//设置job的业务逻辑类路径JobDetail jobDetail JobBuilder.newJob(clsss)//设置job的名称组名称.withIdentity(param.getJobName(), param.getJobGroupName())//设置对job的说明描述.withDescription(param.getRemarks())//向job传递参数.usingJobData(param.getJobDataMap()).build();// 创建触发器CronTrigger trigger TriggerBuilder.newTrigger()//设置触发器的名称触发器的组名.withIdentity(param.getTriggerName(), param.getTriggerGroupName()).startNow()//设置corn表达式.withSchedule(CronScheduleBuilder.cronSchedule(param.getCorn())).build();// 启动调度器scheduler.start();scheduler.scheduleJob(jobDetail, trigger);return CommonResult.success(添加任务成功);}return CommonResult.fail(CodeEnum.ILLEGAL_PARAMETER);} catch (Exception e) {log.info(创建定时任务失败{} , e.getMessage());return CommonResult.fail(添加任务失败e.getMessage());}}/*** 暂停任务* param param* return*/Overridepublic CommonResultString pauseJob(RecordsParam param) {try {if(param!null){//设置任务名称任务组名称scheduler.pauseJob(JobKey.jobKey(param.getJobName(), param.getJobGroupName()));return CommonResult.success(暂停任务成功);}return CommonResult.fail(CodeEnum.ILLEGAL_PARAMETER);} catch (SchedulerException e) {log.info(暂停任务失败{} , e.getMessage());return CommonResult.fail(暂停任务失败e.getMessage());}}/*** 恢复任务* param param* return*/Overridepublic CommonResultString resumeJob(RecordsParam param) {try {if(param!null){//设置任务名称任务组名称scheduler.resumeJob(JobKey.jobKey(param.getJobName(), param.getJobGroupName()));return CommonResult.success(恢复任务成功);}return CommonResult.fail(CodeEnum.ILLEGAL_PARAMETER);} catch (SchedulerException e) {log.info(恢复任务失败{} , e.getMessage());return CommonResult.fail(恢复任务失败e.getMessage());}}/*** 修改任务* param param* return*/OverrideTransactionalpublic CommonResultString updateJob(RecordsParam param) {if(param!null){//删除之前的任务deleteJob(param);//创建新的任务addJob(param);return CommonResult.success(修改任务成功);}return CommonResult.fail(CodeEnum.ILLEGAL_PARAMETER);}/*** 删除任务* param param* return*/Overridepublic CommonResultString deleteJob(RecordsParam param) {try {if(param!null){//设置任务名称任务组名称scheduler.pauseTrigger(TriggerKey.triggerKey(param.getJobName(), param.getJobGroupName()));scheduler.unscheduleJob(TriggerKey.triggerKey(param.getJobName(), param.getJobGroupName()));scheduler.deleteJob(JobKey.jobKey(param.getJobName(), param.getJobGroupName()));return CommonResult.success(删除任务成功);}return CommonResult.fail(CodeEnum.ILLEGAL_PARAMETER);} catch (SchedulerException e) {log.info(删除任务失败{} , e.getMessage());return CommonResult.fail(删除任务失败e.getMessage());}}Overridepublic CommonResultListQuartzJobVO getJobAndTriggerDetails(RecordsParam param) {param.setPageIndex((param.getPage() - 1) * param.getSize());//查询任务列表return CommonResult.success(quartzJobMapper.getJobAndTriggerDetails(param));}}
编写controller
TestQuartzController
package com.wf.test_quartz_demo.controller;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wf.test_quartz_demo.bean.CommonResult;
import com.wf.test_quartz_demo.bean.QuartzJobVO;
import com.wf.test_quartz_demo.bean.RecordsParam;
import com.wf.test_quartz_demo.service.TestQuartzJobInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** Description: 测试任务调度*/
RestController
RequestMapping(/quartz/)
Slf4j
public class TestQuartzController {AutowiredTestQuartzJobInfoService testQuartzJobInfoService;/*** 添加任务* param param* return*/PostMapping(path /add)ResponseBodypublic CommonResultString addJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.addJob(param);}/*** 暂停任务* param param* return*/PostMapping(path /pause)ResponseBodypublic CommonResultString pauseJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.pauseJob(param);}/*** 恢复任务* param param* return*/PostMapping(path /resume)ResponseBodypublic CommonResultString resumeJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.resumeJob(param);}/*** 修改任务**/PostMapping(path /update)ResponseBodypublic CommonResultString updateJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.updateJob(param);}/*** 删除任务**/PostMapping(path /delete)ResponseBodypublic CommonResultString deleteJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.deleteJob(param);}/*** 查询任务*/PostMapping(path /query)ResponseBodypublic CommonResultListQuartzJobVO queryJob(RequestBody RecordsParam param) {return testQuartzJobInfoService.getJobAndTriggerDetails(param);}}
编写具体任务
MyJobOne
package com.wf.test_quartz_demo.job;import cn.hutool.core.date.DateUtil;import cn.hutool.extra.spring.SpringUtil;
import com.wf.test_quartz_demo.bean.CommonResult;
import com.wf.test_quartz_demo.bean.QuartzJobVO;
import com.wf.test_quartz_demo.bean.RecordsParam;
import com.wf.test_quartz_demo.mapper.QuartzJobInfoMapper;
import com.wf.test_quartz_demo.service.impl.TestQuartzJobServiceImpl;import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;import javax.annotation.Resource;
import java.util.List;/*** Description: 任务一*/
Slf4j
public class MyJobOne implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext) {//获取传递过来的参数JobDataMap jobDataMap jobExecutionContext.getJobDetail().getJobDataMap();//此处无法通过spring获取mapperQuartzJobInfoMapper quartzJobMapper SpringUtil.getBean(quartzJobInfoMapper);//查询任务列表ListQuartzJobVO result quartzJobMapper.getJobAndTriggerDetails(new RecordsParam());log.info(任务列表总数为{} , result.size());log.info(MyJobOne执行时间---: {} , DateUtil.now());jobDataMap.forEach((key,value)-{log.info(MyJobOne接收到的参数Key---value---{}--{},key,value);});}}
MyJobTwo
package com.wf.test_quartz_demo.job;import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wf.test_quartz_demo.bean.QuartzJobVO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;/*** Description: 任务2*/
Slf4j
public class MyJobTwo implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext) {//获取传递过来的参数JobDataMap jobDataMap jobExecutionContext.getJobDetail().getJobDataMap();log.info(MyJobTwo执行时间---: {} , DateUtil.now());jobDataMap.forEach((key,value)-{log.info(MyJobTwo接收到的参数Key---value---{}--{},key,value);});}
}
测试运行
运行效果 注其余接口全部测试过都能正常运行此处不在测试
完整代码 Gitee地址