五分钟体验分布式调度框架xxl-job

2020/06/13

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

本教程主要介绍怎么在spring boot工程中快速使用xxl-job。详细的xxl-job的使用文档请参考:https://www.xuxueli.com/xxl-job/

简介

在xxl-job中,有2个角色:

  • 一个是调度任务管理系统,xll-job-admin
  • 另一个是xxl-job-excutor,通常是我们业务系统,比如本案例的springboot业务系统。

整个调度任务执行流程如下:

  • Xxl-job-admin官方代码已经写好,不做定制化开发的话,直接启动即可正常运行。启动Xxl-job-admin工程。
  • xxl-job-excuotr需要配置xxl-job-admin的地址,主动向Xxl-job-admin注册,并建立netty连接。在xxl-job-excutor中需要实现excutor的业务代码。

xxl-job-admin

Xxl-job-admin是调度任务的管理中心。所有的excutor都会向xxl-job-admin注册,注册完成之后可以对excutor进行任务分发。

在官网中下载最新的release代码,比如本文中的v2.2.0版本,下载地址为https://github.com/xuxueli/xxl-job/releases。

Xxl-job-admin需要Mysql数据库,请提前准备安装好。然后在数据库中导入代码工程中的doc/sql目录下的s ql文件。

然后修改xxl-job-admin工程中的resources中的application.properties的数据库配置,如下:

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=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

修改之后,启动XxlJobAdminApplication的main函数,xxl-job-admin启动成功。

在浏览器上访问http://localhost:8081/xxl-job-admin/ ,登陆用户名为admin,密码为123456。登陆成功后,显示的界面如下:

xxl-job-excutor

xxl-job-excutor是任务的执行单元,需要在业务系统中去实现。本案例中是一个springboot的工程,此工程需要集成xxl-job作为任务执行单元。在工程的pom.xml文件中引入xxl-job-core的依赖如下:

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

在工程的application.properties中配置xxl.job.admin.addresses的地址,配置含义见注释,具体配置如下:

# web port
server.port=8082
# no web
#spring.main.web-environment=false

# log config
logging.config=classpath:logback.xml

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=../applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

需要初始化一个XxlJobSpringExecutor,该类用于处理xxl-job-admin和xxl-job-excutor之间的通讯以及任务的处理。

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

注册一个任务,任务名为demoJobHandler。

@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);


    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        logger.info("XXL-JOB, Hello World. params:"+param);
        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        return ReturnT.SUCCESS;
    }
 }

在xxl-job-admin中可以看到demoJobHandler的配置,在控制台启动任务。

启动任务后,可以看到执行任务的日志。同时在xxl-job-excutor中可以看到任务执行的业务日志。

源码下载

https://github.com/forezp/distributed-lab/tree/master/xxl-job

本文为原创文章,转载请标明出处。
本文链接:https://www.fangzhipeng.com/architecture/2020/06/13/xxljob-test.html
本文出自方志朋的博客


(转载本站文章请注明作者和出处 方志朋-forezp

宝剑锋从磨砺出,梅花香自苦寒来,用心分享,一起成长,做有温度的攻城狮!

Post Directory