Github上对xxl-job的介绍
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
核心概念
这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用
如果你已经使用过了,可直接跳过本节和下一节,快进到后面原理部分讲解
1、调度中心
调度中心是一个单独的Web服务,主要是用来触发定时任务的执行
它提供了一些页面操作,我们可以很方便地去管理这些定时任务的触发逻辑
调度中心依赖数据库,所以数据都是存在数据库中的
调度中心也支持集群模式,但是它们所依赖的数据库必须是同一个
所以同一个集群中的调度中心实例之间是没有任何通信的,数据都是通过数据库共享的
2、执行器
执行器是用来执行具体的任务逻辑的
执行器你可以理解为就是平时开发的服务,一个服务实例对应一个执行器实例
每个执行器有自己的名字,为了方便,你可以将执行器的名字设置成服务名
3、任务
任务什么意思就不用多说了
一个执行器中也是可以有多个任务的
总的来说,调用中心是用来控制定时任务的触发逻辑,而执行器是具体执行任务的,这是一种任务和触发逻辑分离的设计思想,这种方式的好处就是使任务更加灵活,可以随时被调用,还可以被不同的调度规则触发。
参考链接:# 新来个架构师,把xxl-job原理讲的炉火纯青~~
1.Github源码下载
结构如下:
2.运行xxl-job-admin调度中心
2.1 修改xxl-job\xxl-job-admin\src\main\resources\application.properties中的mysql
保证我们的调度中心和我们自己的业务程序共享一套mysql
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.2 执行sql脚本:xxl-job\doc\db\tables_xxl_job.sql
2.3 运行XxlJobAdminApplication.java
位置
xxl-job\xxl-job-admin\src\main\java\com\xxl\job \admin\XxlJobAdminApplication
启动可以打成一个jar包,或者本地启动就是可以的
启动完成之后,访问下面这个地址就可以访问到控制台页面了
http://localhost:8080/xxl-job-admin/toLogin 用户名密码默认是 admin/123456
2.4 新增执行器
2.5 新增任务
新创建的任务默认不会启动,需要用户手动启动
3 如何在我们的自己的项目中使用xxl-job
3.1 在我们自己的springboot项目中引入xxl-job依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
3.2 配置XxlJobSpringExecutor
关于XxlJobSpringExecutor的底层执行过程可以跳转到111查看
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfiguration {
/**
* 任务的执行和触发分离
* 执行:我们的业务代码
* 触发:定时任务的管理、轮询、通知
*
* @return
*/
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
//设置调用中心的连接地址,多个逗号分隔
xxlJobSpringExecutor.setAdminAddresses("http://localhost:8080/xxl-job-admin");
//设置执行器的名称,对应调度中心xxl-job-admin中的执行器
xxlJobSpringExecutor.setAppname("group1");
// 底层会启动一个netty服务端来跟调度中心xxl-job-admin交互,会使用到该端口
xxlJobSpringExecutor.setPort(9999);
//这个token是保证访问安全的,默认是这个,当然可以自定义,
// 但需要保证调度中心配置的xxl.job.accessToken属性跟这个token是一样的
xxlJobSpringExecutor.setAccessToken("default_token");
//任务执行日志存放的目录
xxlJobSpringExecutor.setLogPath("./");
// 日志保留天数,最小值为3天,否则设置无效(见JobLogFileCleanThread)
xxlJobSpringExecutor.setLogRetentionDays(3);
return xxlJobSpringExecutor;
}
}
3.2.1 XxlJobSpringExecutor可配参数解释
| 参数 | 解释 | |
|---|---|---|
| adminAddresses | 设置调用中心xxl-job-admin的连接地址,多个逗号分隔 | http://localhost:8080/xxl-job-admin |
| accessToken | 这个token是保证访问安全的,默认是default_token,支持自定义,但需要保证调度中心配置的xxl.job.accessToken属性跟这个token是一样的 | default_token |
| appname | 设置执行器的名称,对应调度中心xxl-job-admin中的执行器AppName,一般跟我们应用的appname保持一致 | |
| address | 本机ip和port,程序启动后通过异步线程将address发送给调度中心(见EmbedServer.startRegistry()),调度中心通过该address控制任务了,默认是http://{ip}:{port}/,一般不填 | http://{ip}:{port}/ |
| ip | 默认是本机ip,一般不填 | |
| port | 默认是9999,底层会启动一个netty服务端来跟调度中心xxl-job-admin交互,会使用到该端口 | |
| logPath | 任务执行日志存放的目录 | ./ |
| logRetentionDays | 日志保留天数,最小值为3天,否则设置无效(见JobLogFileCleanThread) |
3.3 配置定时任务
@XxlJob注解的value值对应调度中心任务里的JobHandler
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TestJob {
// value对应调度中心任务里的JobHandler
@XxlJob(value = "jobHandlerName1", init = "init", destroy = "destroy")
public void x() {
log.info("xxl-job is running");
}
public void init() {
log.info("init");
}
public void destroy() {
log.info("destroy");
}
}
运行我们的springboot项目后,发现定时任务定时在跑了。
3.3.1 @XxlJob注解解释
@XxlJob只能被使用在spring bean下的方法上,每一个方法都会在应用启动后被封装成一个MethodJobHandler,然后保存到本地的XxlJobExecutor.jobHandlerRepository中
package com.xxl.job.core.handler.annotation;
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface XxlJob {
/**
* jobhandler name
*/
String value();
/**
* init handler, invoked when JobThread init
*/
String init() default "";
/**
* destroy handler, invoked when JobThread destroy
*/
String destroy() default "";
}
| 参数 | 解释 |
|---|---|
| value | 对应调度中心中任务的JobHandler,需要保证每个jvm下value唯一 |
| init | 在JobThread被首次初始化后通过反射调用 |
| destroy | 在JobThread被销毁后通过反射调用 |