01 xxl-job入门和使用

482 阅读5分钟

Github上对xxl-job的介绍

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

核心概念

这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用

如果你已经使用过了,可直接跳过本节和下一节,快进到后面原理部分讲解

1、调度中心

调度中心是一个单独的Web服务,主要是用来触发定时任务的执行

它提供了一些页面操作,我们可以很方便地去管理这些定时任务的触发逻辑

调度中心依赖数据库,所以数据都是存在数据库中的

调度中心也支持集群模式,但是它们所依赖的数据库必须是同一个

所以同一个集群中的调度中心实例之间是没有任何通信的,数据都是通过数据库共享的

2、执行器

执行器是用来执行具体的任务逻辑的

执行器你可以理解为就是平时开发的服务,一个服务实例对应一个执行器实例

每个执行器有自己的名字,为了方便,你可以将执行器的名字设置成服务名

3、任务

任务什么意思就不用多说了

一个执行器中也是可以有多个任务的

总的来说,调用中心是用来控制定时任务的触发逻辑,而执行器是具体执行任务的,这是一种任务和触发逻辑分离的设计思想,这种方式的好处就是使任务更加灵活,可以随时被调用,还可以被不同的调度规则触发。

参考链接:# 新来个架构师,把xxl-job原理讲的炉火纯青~~

1.Github源码下载

结构如下:

image.png

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

image.png

2.4 新增执行器

image.png

2.5 新增任务

image.png

新创建的任务默认不会启动,需要用户手动启动

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可配参数解释

image.png

参数解释
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被销毁后通过反射调用