就现在而言,关于定时任务有各种各样的架构:Java 定时器类【Timer】,Spring定时器类【@Scheduled】,Quartz分布式定时器类,xxl-job分布式任务调度平台。xxl-job是一款轻量级定时任务可以分布式部署的调度平台。很多大的公司都在采用。
整体来说,xxl-job就是quartz的一个增强版,其弥补了quartz不支持并行调度,不支持失败处理策略和动态分片的策略等诸多不足,同时其有管理界面,上手比较容易,支持分布式,适用于分布式场景下的使用。两者相同的是都是通过数据库锁来控制任务不能重复执行。
1.quartz
public class StdSchedulerFactory implements SchedulerFactory {
public static final String PROPERTIES_FILE = "org.quartz.properties";
public void initialize() throws SchedulerException {
// 前提需要通过 System.setProperty(PROPERTIES_FILE) 设置 PROPERTIES_FILE 指定的value
String requestedFile = System.getProperty(PROPERTIES_FILE);
String propFileName = requestedFile != null ? requestedFile: "quartz.properties";
// propFileNameb:绝对路径
File propFile = new File(propFileName);
Properties props = new Properties();
InputStream in = null;
try {
if (propFile.exists()) {// 绝对路径下存在目标文件
in = new BufferedInputStream(new FileInputStream(propFileName));
props.load(in);// 将配置文件中kv配置值加载到对象Properties
} else if (requestedFile != null) {
// 通过类加载器将类路径下的指定文件转化为输入流
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(requestedFile);
in = new BufferedInputStream(in);
props.load(in);
} else {//以下均为类加载器加载类路径下的文件
//获取类加载器
ClassLoader cl = getClass().getClassLoader();
if(cl == null)cl = findClassloader();
// 默认从类路径下加载 quartz.properties 文件
in = cl.getResourceAsStream("quartz.properties");
if (in == null) {
//不要在路径添加绝对路径"/"
in = cl.getResourceAsStream("/quartz.properties");
}
if (in == null) {
in = cl.getResourceAsStream("org/quartz/quartz.properties");
}
props.load(in);
}
} finally {
if(in != null) {
try { in.close(); } catch(IOException ignore) { /* ignore */ }
}
}
initialize(overrideWithSysProps(props, getLog()));
}
}
2.xxl_job
调度中心~xxl-job-admin:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
执行器~xxl-job-executor-sample-springboot:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。
2.1.调度中心
执行器通过如下地址自动上报至调度中心:
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
表xxl_job_info:记录任务的列表 ,包含每个任务的调度类型、运行模式、状态。
任务开启状态下,执行器中断重启后将继续执行任务。
2.2.执行器
每个执行器都会将自己地址信息上报至调度中心,调度中心根据策略调用调用执行器触发任务。
分布式任务调度平台XXL-JOB