# 一、 XXL-JOB 介绍

XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网:https://www.xuxueli.com/xxl-job/

文档:https://www.xuxueli.com/xxl-job/#《分布式任务调度平台 XXL-JOB》

XXL-JOB 主要有调度中心、执行器、任务:

image-20231102114124616

调度中心:

​ 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;

​ 主要职责为执行器管理、任务管理、监控运维、日志管理等

任务执行器:

​ 负责接收调度请求并执行任务逻辑;

​ 只要职责是注册服务、任务执行服务(接收到任务后会放入线程池中的任务队列)、执行结果上报、日志服务等

** 任务:** 负责执行具体的业务处理。

调度中心与执行器之间的工作流程如下:

image-20231102114151941

执行流程:

​ 1. 任务执行器根据配置的调度中心的地址,自动注册到调度中心

​ 2. 达到任务触发条件,调度中心下发任务

​ 3. 执行器基于线程池执行任务,并把执行结果放入内存队列中、把执行日志写入日志文件中

​ 4. 执行器消费内存队列中的执行结果,主动上报给调度中心

​ 5. 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情


# 二、使用配置

执行命令拉取 xxl-job-2.3.1

docker pull xuxueli/xxl-job-admin:2.3.1

拉取成功后,创建挂载配置路径:

mkdir -p -m 777 /root/tmp/xxl-job/data/applogs

创建完成后在 /root/tem/xxl-job/ 目录中 创建 配置文件 application.properties

image-20231102102637272

配置内容如下:

里面就更改下自己的 ip 地址和数据库账户和密码即可。

### web
server.port=8080
server.servlet.context-path=/xxl-job-admin
 
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
 
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
 
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
 
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
 
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.249.128:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=dkx.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
 
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
 
### xxl-job, access token
xxl.job.accessToken=default_token
 
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
 
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
 
### xxl-job, log retention days
xxl.job.logretentiondays=30

到 github 中 拉取一下项目里面有一个 sql 文件:https://github.com/xuxueli/xxl-job

或者到码云:https://gitee.com/xuxueli0323/xxl-job 拉取项目。主要是 sql 文件啊

我们需要找到这个 sql 文件然后创建一个数据库并导入 sql 文件,再进行下一步!

image-20231102103400507

image-20231102103536623

配置完成后启动 xxl-job-2.3.1 并创建容器:

docker run  -p 18080:8080 -d --name=xxl --restart=always -v /root/tmp/xxl-job/application.properties:/application.properties  -e PARAMS='--spring.config.location=/application.properties' xuxueli/xxl-job-admin:2.3.1

启动成功后访问 uri:http://192.168.249.128:18080/xxl-job-admin/jobgroup

账号:admin ,密码:123456

访问后页面如下:

image-20231102102848028

创建一个执行器

image-20231102104642146

点击新增,填写执行器信息,appname 是前边在 nacos 中配置 xxl 信息时指定的执行器的应用名。

image-20231102104700103

添加成功:

image-20231102104719719

在需要用到的业务模块中导入依赖:

PS:这里建议使用 2.3.0 版本因为一下版本使用起来有差别 方法必须有一个参数是 String 类型和返回值类型 ReturnT

<dependency>
   <groupId>com.xuxueli</groupId>
   <artifactId>xxl-job-core</artifactId>
</dependency>

配置 application.yml 如下,也可以配置到 nacos 中:

xxl:
  job:
    admin: 
      addresses: http://192.168.101.65:8088/xxl-job-admin
    executor:
      appname: media-process-service
      address: 
      ip: 
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
    accessToken: default_token

<font color='red'> 注意 </font > 配置中的 appname 这是执行器的应用名,port 是执行器启动的端口,如果本地启动多个执行器注意端口不能重复。

在从 github 或者 gitee 中拉取的 xxl-job-2.3.1 项目中找到

E:\ 学成在线项目 — 资料 \day06 断点续传 xxl-job\ 资料 \xxl-job-2.3.1\xxl-job-executor-samples\xxl-job-executor-sample-springboot\src\main\java\com\xxl\job\executor\core\config\XxlJobConfig.java

配置文件

image-20231102105732814

将该配置文件拷贝到 自己项目的该模块的 config 目录中

image-20231102105838113

启动服务

image-20231102110215950

可以看到服务就自动的注册到了执行器中了

image-20231102110243545

点击 查看 (1)

image-20231102110416038

执行器执行任务

从 xxl-job-2.3.1 项目中先来拿到一个例子就是如下代码:

E:\ 学成在线项目 — 资料 \day06 断点续传 xxl-job\ 资料 \xxl-job-2.3.1\xxl-job-executor-samples\xxl-job-executor-sample-springboot\src\main\java\com\xxl\job\executor\service\jobhandler\SampleXxlJob.java

image-20231102111700620

然后将这个代码,拷贝到自己项目的模块的 service 业务中。

/**
 * XxlJob 开发示例(Bean 模式)
 *
 * 开发步骤:
 *      1、任务开发:在 Spring Bean 实例中,开发 Job 方法;
 *      2、注解配置:为 Job 方法添加注解 "@XxlJob (value=" 自定义 jobhandler 名称 ", init ="JobHandler 初始化方法 ", destroy ="JobHandler 销毁方法 ")",注解 value 值对应的是调度中心新建任务的 JobHandler 属性的值。
 *      3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
 *      4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
 *
 * @author xuxueli 2019-12-11 21:52:51
 */
@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
    /**
     * 1、简单任务示例(Bean 模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
			System.out.println("视频处理...");
        // default success
    }
}

image-20231102111804565

然后就可以在这里面来编写自己的业务逻辑代码了。

那么这个任务执行器中的任务怎么执行呢,我们需要到控制台中的执行任务中进行配置:

image-20231102112746770

其中的 bean 指的就是 执行任务 业务逻辑代码中注入的 bean 名称

也可以选择其它的比如 Java 那么右边的框就不能输入了,下面就是输入要执行的 Java 代码。

搞完上面的后就重启后端服务

image-20231102113214411

启动服务后那 任务怎么执行呢,我们需要 ,在控制台 中 任务管理的 任务

image-20231102113310041

启动后就可以看到每隔 5 秒后端控制台就会打印出一句话

c.xxl.job.core.executor.XxlJobExecutor   : >>>>>>>>>>> xxl-job regist JobThread success, jobId:2, handler:com.xxl.job.core.handler.impl.MethodJobHandler@1dcca426[class com.xuecheng.media.service.jobhandler.SampleXxlJob#demoJobHandler]
视频处理...
视频处理...
视频处理...
视频处理...
视频处理...
视频处理...

在运行报表中可以看到调度情况如下

image-20231102113642675