超详细 任务调度框架Quartz用法指南( 三 )


文章插图
 
从上面的截图中,可以看到这个定时任务模块实现了:

  • cron表达式定时执行
  • 并发执行
  • 错误策略
  • 启动执行、暂停执行
如果再加上:设置启动时间、停止时间 就更好了 。不过启停时间只是调用两个方法而已,也就不写了 。
这一部分就主要是看RuoYi 框架代码,然后加一点我需要用的功能 。
前端部分就不写了,全部用 swagger 代替,一些基础字段也删除了,仅复制主体功能 。
已完成代码示例:
https://gitee.com/qianwei4712/code-of-shiva/tree/master/quartz
环境准备从 springboot 2.4.10 开始,添加 quartz 的 maven 依赖:
<!--Quartz 任务调度 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>Application 配置文件:
# 开发环境配置server:# 服务器的HTTP端口port: 80servlet:# 应用的访问路径context-path: /Tomcat:# tomcat的URI编码uri-encoding: UTF-8spring:datasource:username: rootpassword: rooturl: jdbc:MySQL://127.0.0.1:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=truedriver-class-name: com.mysql.cj.jdbc.Driver# HikariPool 较佳配置hikari:# 客户端(即您)等待来自池的连接的最大毫秒数connection-timeout: 60000# 控制将测试连接的活动性的最长时间validation-timeout: 3000# 控制允许连接在池中保持空闲状态的最长时间idle-timeout: 60000login-timeout: 5# 控制池中连接的最大生存期max-lifetime: 60000# 控制允许池达到的最大大小,包括空闲和使用中的连接maximum-pool-size: 10# 控制HikariCP尝试在池中维护的最小空闲连接数minimum-idle: 10# 控制默认情况下从池获得的连接是否处于只读模式read-only: falseQuartz 自带有数据库模式,脚本都是现成的:
下载这个脚本:
https://gitee.com/qianwei4712/code-of-shiva/blob/master/quartz/quartz.sql
保存任务的数据库表:
CREATE TABLE `quartz_job` (`job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID',`job_name` varchar(64) NOT NULL DEFAULT '' COMMENT '任务名称',`job_group` varchar(64) NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',`invoke_target` varchar(500) NOT NULL COMMENT '调用目标字符串',`cron_expression` varchar(255) DEFAULT '' COMMENT 'cron执行表达式',`misfire_policy` varchar(20) DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',`concurrent` char(1) DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1暂停)',`remark` varchar(500) DEFAULT '' COMMENT '备注信息',PRIMARY KEY (`job_id`,`job_name`,`job_group`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='定时任务调度表';最后准备一个任务方法:
@Slf4j@Component("mysqlJob")public class MysqlJob {protected final Logger logger = LoggerFactory.getLogger(this.getClass());public void execute(String param) {logger.info("执行 Mysql Job,当前时间:{},任务参数:{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), param);}}核心代码ScheduleConfig 配置代码类:
@Configurationpublic class ScheduleConfig {@Beanpublic SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setDataSource(dataSource);// quartz参数Properties prop = new Properties();prop.put("org.quartz.scheduler.instanceName", "shivaScheduler");prop.put("org.quartz.scheduler.instanceId", "AUTO");// 线程池配置prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");prop.put("org.quartz.threadPool.threadCount", "20");prop.put("org.quartz.threadPool.threadPriority", "5");// JobStore配置prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");// 集群配置prop.put("org.quartz.jobStore.isClustered", "true");prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");// sqlserver 启用// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");prop.put("org.quartz.jobStore.misfireThreshold", "12000");prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");factory.setQuartzProperties(prop);factory.setSchedulerName("shivaScheduler");// 延时启动factory.setStartupDelay(1);factory.setApplicationContextSchedulerContextKey("applicationContextKey");// 可选,QuartzScheduler// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了factory.setOverwriteExistingJobs(true);// 设置自动启动,默认为truefactory.setAutoStartup(true);return factory;}}


推荐阅读