Quartz定时任务项目中应用
创始人
2025-05-31 07:52:35
0

Quartz定时任务项目中应用

一.数据库表准备

Quartz 存储任务信息有两种方式,使用内存或者使用数据库来存储,这里我们采用 MySQL 数据库存储的方式,首先需要新建 Quartz 的相关表,sql 脚本下载地址:http://www.quartz-scheduler.org/downloads/,名称为 tables_mysql.sql,创建成功后数据库中多出 11 张表

二.依赖导入

org.springframework.bootspring-boot-starter-quartz

三.application.yml配置

# 定时任务配置
sprinng:quartz:#数据库方式job-store-type: jdbc# quartz 相关属性配置properties:org:quartz:scheduler:instanceName: examSchedulerinstanceId: AUTOjobStore:class: org.quartz.impl.jdbcjobstore.JobStoreTXdriverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegatetablePrefix: QRTZ_isClustered: trueclusterCheckinInterval: 10000useProperties: falsethreadPool:class: org.quartz.simpl.SimpleThreadPoolthreadCount: 10threadPriority: 5threadsInheritContextClassLoaderOfInitializingThread: true

四.自定义实现类实现自定义接口

4.1 引入Scheduler

/*** Quartz定时任务核心的功能实现类*/private Scheduler scheduler;/*** 注入* @param schedulerFactoryBean*/public JobServiceImpl(@Autowired SchedulerFactoryBean schedulerFactoryBean) {scheduler = schedulerFactoryBean.getScheduler();}

4.2定义接口JobService

/*** 任务业务类,用于动态处理任务信息* @author bool * @date 2020/11/29 下午2:17*/
public interface JobService {/*** 任务数据*/String TASK_DATA = "taskData";/*** 添加定时任务* @param jobClass* @param jobName* @param jobGroup* @param cron* @param data*/void addCronJob(Class jobClass, String jobName, String jobGroup, String cron, String data);/*** 添加立即执行的任务* @param jobClass* @param jobName* @param jobGroup* @param data*/void addCronJob(Class jobClass, String jobName, String jobGroup, String data);/*** 暂停任务* @param jobName* @param jobGroup*/void pauseJob(String jobName, String jobGroup);/*** 恢复任务* @param triggerName* @param triggerGroup*/void resumeJob(String triggerName, String triggerGroup);/*** 删除job* @param jobName* @param jobGroup*/void deleteJob(String jobName, String jobGroup);
}

4.3定义实现类JobServiceImpl

@Service
public class JobServiceImpl implements JobService {/*** Quartz定时任务核心的功能实现类*/private Scheduler scheduler;/*** 注入* @param schedulerFactoryBean*/public JobServiceImpl(@Autowired SchedulerFactoryBean schedulerFactoryBean) {scheduler = schedulerFactoryBean.getScheduler();}@Overridepublic void addCronJob(Class jobClass, String jobName, String jobGroup, String cron, String data) {try {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);JobDetail jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail != null) {log.info("++++++++++任务:{} 已存在", jobName);this.deleteJob(jobName, jobGroup);}log.info("++++++++++构建任务:{},{},{},{},{} ", jobClass.toString(), jobName, jobGroup, cron, data);//构建job信息jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();//用JopDataMap来传递数据jobDetail.getJobDataMap().put(TASK_DATA, data);//表达式调度构建器(即任务执行的时间,每5秒执行一次)CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);//按新的cronExpression表达式构建一个新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void addCronJob(Class jobClass, String jobName, String jobGroup, String data) {// 随机3-8秒后执行java.util.Calendar cl = java.util.Calendar.getInstance();cl.setTimeInMillis(System.currentTimeMillis());cl.add(Calendar.SECOND, 3 + new Random().nextInt(5));this.addCronJob(jobClass, jobName, jobGroup, CronUtils.dateToCron(cl.getTime()), data);}@Overridepublic void pauseJob(String jobName, String jobGroup) {try {TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);scheduler.pauseTrigger(triggerKey);log.info("++++++++++暂停任务:{}", jobName);} catch (SchedulerException e) {e.printStackTrace();}}@Overridepublic void resumeJob(String jobName, String jobGroup) {try {TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);scheduler.resumeTrigger(triggerKey);log.info("++++++++++重启任务:{}", jobName);} catch (SchedulerException e) {e.printStackTrace();}}@Overridepublic void deleteJob(String jobName, String jobGroup) {try {JobKey jobKey = JobKey.jobKey(jobName,jobGroup);scheduler.deleteJob(jobKey);log.info("++++++++++删除任务:{}", jobKey);} catch (SchedulerException e) {e.printStackTrace();}}
}

4.4 业务需要执行的定时方法

我们自己如果需要执行一个定时方法需要实现Job接口,重写execute方法,例子如下:
我们可以写多个这种类,供我们执行不同的定时操作任务!

@Component
public class AddBookJob implements Job {@Autowiredprivate PaperQuService paperQuService;@Autowiredprivate UserBookService userBookService;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {JobDetail detail = jobExecutionContext.getJobDetail();String name = detail.getKey().getName();String group = detail.getKey().getGroup();String data = String.valueOf(detail.getJobDataMap().get(JobService.TASK_DATA));log.info("++++++++++定时任务:考完加入错题本");log.info("++++++++++jobName:{}", name);log.info("++++++++++jobGroup:{}", group);log.info("++++++++++taskData:{}", data);// 转换数据,id为试卷id,examId为考试IDPaperDTO dto = JSON.parseObject(data, PaperDTO.class);// 错题列表List ids = paperQuService.listWrongIds(dto.getId());for (String id : ids) {//加入错题本userBookService.addBook(dto.getUserId(), dto.getExamId(), id);}}
}

addCronJob 函数参数解释

业务中调用时使用注入的上文中接口类jobService,调用addCroJob方法实现方.

jobService.addCronJob(AddBookJob.class, bookName, JobGroup.SYSTEM, JSON.toJSONString(dto)); //业务中调用@Overridepublic void addCronJob(Class jobClass, String jobName, String jobGroup, String cron, String data) {//参数解释//1.jobClass 就是我们自己定义的需要定时执行的类//2.jobName 自定义的该任务的Key//3.jobGroup 自定义的分组//4.cron 就是Cron表达式,通常使用下述Cron工具类直接调用//5.data 是在业务中需要传到我们自己定义的需要执行的类中的数据(上文中会将该数据存储在表示execute方法中的jobExecutionContext中)}

CronUtils 工具类

public class CronUtils {/*** 格式化数据*/private static final String DATE_FORMAT = "ss mm HH dd MM ? yyyy";/*** 准确的时间点到表达式* @param date* @return*/public static String dateToCron(final Date date){SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT);String formatTimeStr = "";if (date != null) {formatTimeStr = fmt.format(date);}return formatTimeStr;}
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...