zoukankan      html  css  js  c++  java
  • XXL-JOB 基础教程

    原文地址:XXL-JOB 基础教程
    博客地址:http://www.extlight.com

    一、背景

    随着公司的产品项目活动的增加,活动进行过程中都需要用到大量定时器。为了能方便快捷的控制定时器的启动、执行和关闭,我们弃用了 Spring Boot 中自带的 @Scheduled 注解,采用开发、配置和操作更为灵活的 XXL-JOB。

    二、介绍

    2.1 简单介绍

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

    其特性非常丰富:

    • 简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
    • 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
    • 调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
    • 执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
    • 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
    • ......

    2.2 架构

    从图中可知,XXL-JOB 架构大致分为2部分:调度中心和执行器。

    • 调度中心:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等

    • 执行器:负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

    三、实战

    3.1 下载

    git clone https://github.com/xuxueli/xxl-job.git
    

    下载后其文件目录如下图:

    官方已经提供完整的案例:

    xxl-job-admin 是任务调度中心项目。生产环境中,我们可以直接使用其源码,打包部署。

    xxl-job-executor-samples 是执行器的案例项目,实际开发中需要整合其配置文件到我们自己的项目中使用。

    xxl-job-core 为核心项目,调度中心和执行器项目都需要依赖它。

    3.2 导入数据

    我们在 xxl-jobdoc db 目录,里边有个名为 tables_xxl_job.sql 文件。

    我们需要在数据库实例中创建名为 xxl_job 的数据库,将上边的 sql 文件在此数据库中执行。

    3.3 启动调度中心

    用 IDEA 打开 xxl-job 项目,选中 xxl-job-admin 子项目,对 application.properties 进行修改:

    ### web
    server.port=8080
    server.servlet.context-path=/xxl-job-admin
    
    ### xxl-job, datasource
    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=tiger
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    

    配置文件还有很多配置,此处我们只修改数据库连接配置,然后运行项目。

    打开浏览器访问 http://localhost:8080/xxl-job-admin, 如下图:

    默认登录账号 “admin/123456”,登录后如下图:

    3.4 任务执行器

    执行器项目的演示,笔者采用实际开发流程方式,即手动新建和配置执行器项目。

    第一步,在搭建执行器项目之前,我们需要将 xxl-job-core 源码打包到本地 Maven 仓库。然后新建 Spring Boot 项目,我们命名为 job-demo

    项目依赖包如下:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.3.0-SNAPSHOT</version>
    </dependency>
    
    

    注意:xxl-job-core 就是刚才打包好的 jar 依赖,当然我们也可以使用远程 Maven 仓库的依赖!

    第二步,我们需要配置 application.properties 文件和 logback.xml 两个文件(从 xxl-job-executor-sample-springboot 复制过来即可):

    # web port
    server.port=8081
    
    # 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:8080/xxl-job-admin
    
    ### xxl-job, access token
    xxl.job.accessToken=
    
    ### xxl-job executor appname
    xxl.job.executor.appname=job-demo
    
    ### 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=/data/applogs/xxl-job/jobhandler
    
    ### xxl-job executor log-retention-days
    xxl.job.executor.logretentiondays=30
    
    

    由于我们是用同一台机器测试,因此我们只需修改 xxl.job.executor.appname,由于只是演示,日志的文件路径就不修改了。

    第三步,配置 XXL-JOB 执行器组件,用于读取 application.properties 中的配置数据:

    @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;
        }
    
    }
    

    第四步,编写定时任务,即项目中的业务代码:

    @Component
    public class MyTask {
    
        /**
         * @XxlJob 中 value 值唯一即可
         * @param param
         * @return
         */
        @XxlJob("firstTask")
        public ReturnT<String> firstTask(String param) {
            
            XxlJobHelper.log("start firstTask param = {}", param);
            
            // 业务代码,此处作为演示只打印 hello xxl-job 
            System.out.println("hello xxl-job");
            
            XxlJobHelper.log("end firstTask");
            
            return ReturnT.SUCCESS;
            
        }
    }
    

    定时器类中,方法必须有 String 类型的入参,返回值必须是 ReturnT<String>,否则启动项目会报错。最后需要使用 @XxlJob 注解,否则调度中心无法调度该任务。

    最后启动执行器项目。

    3.5 配置定时任务

    我们来到 XXL-JOB 的后台管理界面。

    第一步,点击 “执行器管理”,新增执行器:

    第二步,点击 “任务管理”,新增任务:

    我们设置每 5 秒执行一次任务。

    第三步,新增任务成功后,任务列表会出现新增的记录,点击启动:

    控制台打印了 “hello xxl-job”,演示成功。

    本次演示只是粗浅的使用 XXL-JOB 功能,我们还可以在后台管理界面查看任务每次执行的日志等,更多详细资料可参考下文的链接。

    四、参考文档

    XXL 开源社区

  • 相关阅读:
    高级打字机
    不等数列
    间谍网络
    医院设置
    题目编号生成器
    传纸条
    聪明的打字员
    倒水问题
    八数码难题
    生日蛋糕
  • 原文地址:https://www.cnblogs.com/moonlightL/p/14297112.html
Copyright © 2011-2022 走看看