任务调度
一、什么时候需要任务调度?
- 基于时间的任务
- 批量数据的处理
- 异步解耦(比如先做任务A,再做任务B)
二、任务调度的基本需求有哪些?
- 可以定义触发的规则,比如基于时刻、时间间隔、表达式。
- 可以定义需要执行的任务。比如执行一个脚本或者一段代码。任务与规则是分开的。
- 集中管理配置,持久化配置。不需要把规则写在代码里面,可以看到所有的任务配置,方便维护。重启后,任务可以再次调度。
- 支持任务之间的串行执行,比如先执行任务A,再执行任务B。
- 支持多个任务并发执行,互不干扰。
- 有自己的调度器,可以启动、中断、停止任务。
- 容易集成到Spring。
Quartz的不足
调用API的方式操作业务,不人性化。
需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。
调度和任务耦合。调度逻辑和QuartzJobBean耦合在同一个项目中,导致调度系统的性能受限于业务。
随机负载。底层使用抢占式获取DB锁,并由抢占成功的节点负责运行任务,会导致节点负载悬殊非常大。
以上四点是XXL-Job官方文档提供的。
缺少UI界面,也就无法通过UI界面动态调整调度策略。
架构图
运行模式
1、BEAN模式(类形式)
即使是无框架项目,如 main 方法直接启动的项目也提供支持。但是不支持自动扫描任务并注入到执行器容器中,需要手动注入。
继承 IJobHandler 抽象类,重写 execute 方法,如下:
public class SampleFramelessJob extends IJobHandler {
@Override
public void execute() throws Exception {
XxlJobHelper.log("Xxl frameless job starting !!!");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
}
}
然后手动通过 XxlJobExecutor 将 Job 类注入到执行器容器中,如下:
XxlJobExecutor.registJobHandler("sampleFramelessJob", new SampleFramelessJob());
2、BEAN模式(方法形式)
在 Spring 环境中,对某个类标注 @Component 注解,同时对该类下的某个方法标注 @XxlJob 注解。
@Component
public class SampleJob {
@XxlJob("sampleBeanJob")
public void sampleJobHandler() throws Exception {
XxlJobHelper.log("Xxl sample job starting !!!");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
}
}
3、GLUE模式(Java)
在 Web IDE 界面,输入如下代码:
package com.xxl.job.service.handler;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import java.util.concurrent.TimeUnit;
public class DemoGlueJobHandler extends IJobHandler {
@Override
public void execute() throws Exception {
XxlJobHelper.log(