Quartz是什么

Quartz 是 Java 生态里一个专门做 “定时任务” 的库

Quartz 名词 类比 它是什么
Job 活本身 你要执行的代码(比如 “去采集温湿度”)
JobDetail 装活儿的盒子 盒子上写着 “这里面的活叫采集、参数是什么”,它绑定到具体的 Job
Trigger 闹钟 定义了 “什么时候响”(cron 表达式,比如每 5 分钟)
Scheduler 总管 把 “盒子 + 闹钟” 绑一起,然后用一个循环线程盯着所有闹钟,到点就把盒子里的活丢给线程池执行

流程:

Scheduler 里有个循环线程 QuartzSchedulerThread,不停问每个 Trigger:”你的下次触发时间到了吗?” → 到了 → 把对应的 JobDetail 交给线程池 → 线程池起一个线程去跑 Job 里的 execute()

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1. Job:你要干的活
public class CollectJob implements Job {
public void execute(JobExecutionContext context) {
// 这里写"采集温湿度"的逻辑
}
}

// 2. JobDetail:装活的盒子,绑定到 CollectJob
JobDetail jobDetail = JobBuilder.newJob(CollectJob.class)
.withIdentity("job-1") // 给这个盒子起个名字
.build();

// 3. Trigger:闹钟,每5分钟响一次
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger-1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 */5 * * * ?"))
.build();

// 4. Scheduler:把盒子和闹钟绑一起,交给总管
scheduler.scheduleJob(jobDetail, trigger);
// 到点后,Quartz 的循环线程发现 trigger-1 到点了,
// 就找到它绑定的 jobDetail,拿线程池里的线程去跑 CollectJob.execute()

RuoYi封装

插一条记录 → RuoYi 把它翻译成上面的 4 个对象

RuoYi 的 ScheduleUtils.createScheduleJob() 其实就是把上面那段代码 “从数据库配置读出来再组装”:

1
2
3
4
5
6
7
8
9
10
11
// 你配的 concurrent 是 1,就套带并发控制的 Job,否则套普通的
Class<? extends Job> jobClass = job.getConcurrent()
? QuartzDisallowConcurrentExecution.class // 带 @DisallowConcurrentExecution
: QuartzJobExecution.class; // 不带

// 用你表里的 cron 表达式造闹钟
CronTrigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression()))
.build();

scheduler.scheduleJob(jobDetail, trigger); // 注册进总管

到点执行时,RuoYi 用反射去调你配的那个方法

1
2
3
// JobInvokeUtil 里,通过反射调用你配的 beanName + methodName
Method method = beanClass.getMethod(job.getInvokeTarget() 拆分出的方法名);
method.invoke(bean); // 真正执行你的采集方法

所以你把配置存数据库 → RuoYi 用你的配置组装出 JobDetail + Trigger 注册进 Scheduler → 到点 Quartz 跑 Job → Job 里反射调你配的方法。

1
2
3
4
5
6
7
8
9
10
11
sys_job 定时任务配置
↓
Quartz Scheduler 调度
↓
invoke_target 找到 Spring Bean 方法
↓
SensorIngestTask / CameraSnapshotTask
↓
Service 执行采集业务
↓
写入数据库、更新设备状态、记录任务日志

sys_job

字段 含义
job_name 任务名称
invoke_target 要调用的 Bean 方法
cron_expression 执行时间
misfire_policy 错过执行时间后的处理方式
concurrent 是否允许同一任务并发执行
status 正常或暂停