springboot集成XXL-JOB分布式任务调度平台

一、使用背景

目前许多项目使用的都是微服务架构,中间存在许多的定时任务。但如果定时任务维护在每个微服务下,当微服务部署多个实例的情况下,会出现定事任务多次执行的情况。并且在解决问题的基础上,希望能够实现动态修改任务的定时时间,可以通过页面对定时任务进行控制。在XXL-JOB的帮助下,我们就可以在任务调度中心动态地修改定时任务,而不是去项目中通过修改注解的方式去修改定时任务,提升了定时任务使用的灵活性。

 

二、XXL-JOB概述

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

官方地址中文版:http://www.xuxueli.com/xxl-job

源码仓库地址:https://github.com/xuxueli/xxl-job,http://gitee.com/xuxueli0323/xxl-job

 

三、服务端实现过程

1、XXL-JOB项目源码下载:

github地址:https://github.com/xuxueli/xxl-job

项目中,xxl-job-core为核心代码块,xxl-job-admin为任务调度中心管理模块,部署的话,部署xxl-job-admin即可。

2、数据库的创建:

数据库的sql文件位置在项目中的 xxl-job/doc/db/tables_xxl_job.sql 目录下,在Navicat中运行sql文件会自动创建数据库xxl_job并生成相应的数据表。

从官网及sql文件的源码来看,目前暂时只支持Mysql5.7以上的版本

3、修改xxl-job-admin模块的配置文件:

修改xxl-job-admin下的配置文件:application.properties。

在配置文件中,主要需要修改数据库地址(spring.datasource.url)、用户名(spring.datasource.username)、密码的配置(spring.datasource.password)为实际的部署环境。端口号(server.port)默认为8080,可修改。访问地址(server.context-path)默认为xxl-job-admin,可修改。

4、启动xxl-job-admin微服务:

启动成功后,浏览器访问http://localhost:8080/xxl-job-admin/jobinfo可进入任务调度中心。默认用户名及密码:admin/123456

 

四、客户端(自己的项目)实现过程

1、在pom.xml中引入相关依赖:


      com.xuxueli
      xxl-job-core
      2.2.0

2、修改相关配置文件:

这里在bootstrap.properties中添加如下配置:

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=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=http://127.0.0.1:10015/sc-timer-biz
### xxl-job executor server-info
xxl.job.executor.ip=10.165.9.111
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 

访问地址、执行器ip和端口号根据本机情况进行相关的设置。

3、创建 XxlJobConfig.java,具体代码如下:

package com.smxxy.smxsc.timer.biz.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


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

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          
     *             org.springframework.cloud
     *             spring-cloud-commons
     *             ${version}
     *         
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

4、编写handler类(这里是测试代码,实际为需要执行的定时任务):

package com.smxxy.smxsc.timer.biz.handler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;

/**
 * 任务Handler示例(Bean模式)
 * 

* 开发步骤: * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; * 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例; * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ @Component public class DemoJobHandler extends IJobHandler { // 可参考Sample示例执行器中的 "com.xxl.job.executor.service.jobhandler.SampleXxlJob" ,如下: @XxlJob("demoJobHandler") public ReturnT execute(String param) { System.out.println("hello 77777777777777"); XxlJobLogger.log("hello world."); return ReturnT.SUCCESS; } }

5、启动客户端(自己项目中的相关微服务):

启动成功后,会自动在服务器中,增加一个名为【plat-job】的执行器,用来执行定时任务。

 

五、在任务调度中心中进行配置

1、修改执行器:

访问服务器页面登录成功后,点击执行器管理,如图:

springboot集成XXL-JOB分布式任务调度平台_第1张图片

对执行器进行编辑,注册方式改为【手动录入】,机器地址写入客户端(微服务)具体的ip:port后,点击保存。

2、任务管理编辑:

点击【任务管理】页签【新增】按钮,执行器选择plat-job,JobHandler编写为【TestHandler】,Cron为定时计划,如图所示:

springboot集成XXL-JOB分布式任务调度平台_第2张图片

保存后,可点击【执行】按钮,查看是否调用了客户端的Handler处理。在此不再演示。如可执行,则点击【启动】按钮,会在定时计划内,再次调用Handler处理。同时,在对任务的Cron进行修改、保存后,会动态的更新定时计划,实现了项目中的期望。

由于每个微服务的ip和port可以在执行器的机器地址中,通过逗号分隔的方式,可增加多个客户端的地址,则解决了项目中多实例的问题。

你可能感兴趣的:(springboot集成XXL-JOB分布式任务调度平台)