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 |
正常或暂停 |