轻量级分布式任务调度平台--XXLJOB

概述:

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展

Quartz作为开源任务调度中的佼佼者,但是存在一些不足: 

  • 通过调用API的方式操作任务,不人性化。
  • 需要持久化业务的QuartzJobBean到底层数据表中,系统侵入性相当严重。
  • 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务。                                                                                                                     因此xxlJob目前比较受欢迎。

XXLJOB分为两个模块:调度模块,任务模块

调度模块 : 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。
执行模块:  负责接收调度请求并执行任务逻辑.

xxlJob工程搭建及测试:

xxl-job github 地址:https://github.com/xuxueli/xxl-job  将项目拉下来 后面调度模块要用到 

轻量级分布式任务调度平台--XXLJOB

主要用到xxl-job-admin工程,将配置文件中的端口号和数据库地址修改为自己本地的地址

之后启动springboot工程,访问http://localhost:7001/xxl-job-admin/ 账户/密码 : admin/123456

轻量级分布式任务调度平台--XXLJOB

左侧的任务管理可以让我们修改增加删除自己建的任务,如下:

轻量级分布式任务调度平台--XXLJOB

轻量级分布式任务调度平台--XXLJOB

任务模块:

1.添加pom依赖:

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

 

2.配置文件:

public class BaseConfig {


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

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

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

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

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

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

}

注:xxl.job.admin.addresses 等xxlJob配的的一些值可以在Apollo或者application.properties中配置

例:在application.properties中:

server.port=8084
 
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://192.168.112.227:7001/xxl-job-admin
 
###执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
#执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=192.168.112.227
xxl.job.executor.port=9999
xxl.job.login.username=admin
xxl.job.login.password=123456
 
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
#执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;
xxl.job.executor.logretentiondays=-1
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=

3.测试类

@JobHandler(value = "ReportHandler4New")
@Component
@Slf4j
/**
 * @author zy
 * @date 04-16
 */
public class BuildHander4NewReport extends IJobHandler {
    private static Logger logger = LoggerFactory.getLogger(BuildHander4NewReport.class);
    @Autowired
    private BaseConfig config;
    @Autowired
    private BuilderTask4NewReport task4NewReport;

    @Override
    public ReturnT<String> execute(String s) throws Exception {
        String batchNO = "";
        try {
            batchNO = DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS");
            logger.error("xxl-job for report start... batchNO:{}", batchNO);
            XxlJobLogger.log(batchNO);
            //简单业务
            String flag = isNightExecuteTime() ? "1" : "0";
            List<Map> jobList = new Eql("REPORT").select("queryJobList").params(RMap.asMap("flag",flag)).execute();
            //调度日志
            XxlJobLogger.log(jobList.toString());
            buildFile(jobList);
            logger.error(batchNO);
        } catch (Exception e) {
            XxlJobLogger.log(e);
            logger.error("batchNO:{},系统异常:{}", batchNO, e);
            if (e instanceof InterruptedException) {
                throw e;
            }
        }
        return SUCCESS;
    }

 

4.配置定时任务

轻量级分布式任务调度平台--XXLJOB

执行器名称:自己定义,  任务描述:自己定义

cron:cron表达式,规定执行的时间规则          jobHandler: 任务模 式中的名称,见第三步

@JobHandler(value = "ReportHandler4New")这个的值

路由策略,和运行模式有很多种。。。。。自行百度, 

到此为止一个轮询任务就已经完成了。

5.调度日志

轻量级分布式任务调度平台--XXLJOB

最后可以在调度日志中查看日志。

大功告成!!!