XXL_JOB

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

轻量级调度平台,与SpringBoot无缝集成,而且监控界面就集成在调度中心,维护成本低,还有失败的邮件告警等等

环境要求

Jdk1.8+
Maven3+
Mysql5.7+

架构设计

在这里插入图片描述

  • 任务调度中心
    任务调度中心自身并不承担业务逻辑,主要负责向执行器发起调度请求
    在这里插入图片描述
### 访问地址:http://127.0.0.1:8750/xxl-job-admin
### 账号/密码:admin/123456
### web
server.port=8750
server.servlet.context-path=/xxl-job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.**.**:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=lixing
spring.datasource.password=******
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000

### 报警邮箱
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=735245459@qq.com
spring.mail.from=735245459@qq.com
spring.mail.password=**********
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### 调度中心通讯TOKEN [选填]:非空时启用;
### xxl-job, access token
xxl.job.accessToken=

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### xxl-job, log retention days
xxl.job.logretentiondays=30

  • 执行器
    负责接收任务调度中心发起的请求,执行对应的JobHandler业务逻辑
    在这里插入图片描述
package com.xxl.job.executor.service.jobhandler;

import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.util.HttpHelperUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.text.MessageFormat;
import java.util.Arrays;

/**
 * 开发步骤:
 * 1、任务开发:在Spring Bean实例中,开发Job方法;
 * 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
 * 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
 * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
 */
@Component
public class MyFirstXxlJob {
    
    
    private static Logger logger = LoggerFactory.getLogger(MyFirstXxlJob.class);

    public void init(){
    
    
        logger.info("init");
    }
    public void destroy(){
    
    
        logger.info("destroy");
    }

    /**
     * @描述 我的第一个跨平台Http任务,参数示例:"url:http://www.baidu.com\n method:get\n data:content\n"
     * @作者 [email protected]
     * @日期 2021/9/5 15:28
     */
    @XxlJob(value = "MyFirstXxlJobHandler1", init = "init", destroy = "destroy")
    public void MyFirstXxlJobHandler1() throws Exception {
    
    
        // 参数解析
        String param = XxlJobHelper.getJobParam();
        if (param == null || param.trim().length() == 0) {
    
    
            XxlJobHelper.log("param[" + param + "] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        // 读取参数
        String[] httpParams = param.split(";");
        String url = null;
        String method = null;
        String data = null;
        for (String httpParam : httpParams) {
    
    
            if (httpParam.startsWith("url:")) {
    
    
                url = httpParam.substring(httpParam.indexOf("url:") + 4).trim();
            }
            if (httpParam.startsWith("method:")) {
    
    
                method = httpParam.substring(httpParam.indexOf("method:") + 7).trim().toUpperCase();
            }
            if (httpParam.startsWith("data:")) {
    
    
                data = httpParam.substring(httpParam.indexOf("data:") + 5).trim();
            }
        }
        // 参数校验
        if (url == null || url.trim().length() == 0) {
    
    
            XxlJobHelper.log("url[" + url + "] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        if (null == method || !Arrays.asList("GET", "POST").contains(method)) {
    
    
            XxlJobHelper.log("method[" + method + "] invalid.");
            XxlJobHelper.handleFail();
            return;
        }
        boolean isPostMethod = method.equalsIgnoreCase("POST");
        JSONObject jsonObjectParam = null;
        if (null != data && data.length() > 0) {
    
    
            jsonObjectParam = JSONObject.parseObject(data);
        }
        // 发起请求
        String result = HttpHelperUtil.sendRequestHttp(url, isPostMethod ? "POST" : "GET", jsonObjectParam);
        if (null == result) {
    
    
            XxlJobHelper.log(MessageFormat.format("{0} 响应数据为空", url));
            XxlJobHelper.handleFail("响应数据为空");
        } else {
    
    
            XxlJobHelper.log(result);
            XxlJobHelper.handleSuccess(result);
        }
    }

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

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

### “调度中心”服务的访问地址[选填]:为空则关闭自动注册;如果调度中心集群部署(存在多个访问地址)则用逗号分隔;执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
xxl.job.admin.addresses=http://127.0.0.1:8750/xxl-job-admin

### 执行器通讯TOKEN [选填]:非空时启用;
### xxl-job, access token
xxl.job.accessToken=

### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
### xxl-job executor server-info
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

初始化数据库

-- 基于xxl_job的数据库实例对象
CREATE DATABASE xxl_job default character set utf8 collate utf8_general_ci;
-- 为用户复制操作实例的权限 
GRANT ALL PRIVILEGES on xxl_job.* to 'lixing'@'%'; 
-- 刷新权限
FLUSH PRIVILEGES;

在这里插入图片描述
在这里插入图片描述

登录任务调度中心

  • 默认执行器(不推荐使用)
    在这里插入图片描述
  • 创建自定义执行器(表示指向哪些主机的执行器来执行相关业务逻辑)
    在这里插入图片描述
    在这里插入图片描述
  • 创建任务(BEAN模式)
    在这里插入图片描述
    在这里插入图片描述
    注意:JobHandler的值必须要与相关@XxlJob注解的形参一致
    在这里插入图片描述
路由策略:
FIRST(第一个):固定选择第一个机器;
LAST(最后一个):固定选择最后一个机器;
ROUND(轮询):;
RANDOM(随机):随机选择在线的机器;
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
子任务:
每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度
调度过期策略:
忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;
立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间
阻塞处理策略:
单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务
任务超时时间:
支持自定义任务超时时间,任务运行超时将会主动中断任务
失败重试次数:
支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试

猜你喜欢

转载自blog.csdn.net/qq_30818545/article/details/121321013