XXL-Job 是一个基于分布式任务调度框架的开源平台,它基于分布式架构,通过协调任务调度和任务执行器的方式来实现任务调度和执行。架构如图:
- 调度中心:XXL-Job 调度中心是任务的管理与调度核心,负责任务的创建、修改、删除和调度等操作。
- 执行器:执行器是任务的执行容器,可以独立运行在不同的节点上。执行器负责接收任务调度中心分配的任务,并进行执行。执行器将任务执行结果返回给调度中心,并进行状态上报和心跳维持。
- 任务调度:XXL-Job 提供了任务调度功能,可以按照预定的时间或条件执行任务,如定时执行、Cron 表达式调度、固定频率调度等。通过调度中心的管理和调度,可以灵活地控制任务的执行。
- 任务管理:XXL-Job 提供了任务的创建、修改、删除等管理功能,可以方便地对任务进行管理和配置。通过 Web 控制台可以轻松地对任务进行操作。
- 任务执行监控:XXL-Job 提供了任务执行监控功能,可以查看任务的执行状态、执行日志和结果。它还支持统一的任务查看、日志查询和定时报警功能,便于排查任务执行失败并进行及时处理。
- 分布式任务调度:XXL-Job 支持在分布式环境中进行任务调度,并提供了注册中心作为任务执行器的管理和协调中心。可以实现任务的分布调度和负载均衡。
总的来说,XXL-Job 的原理是通过调度中心、执行器和注册中心的协作来实现任务的调度和执行。它的作用是提供灵活的任务调度功能、便捷的任务管理和执行监控,并支持分布式环境下的任务调度和协调。
git clone https://github.com/xuxueli/xxl-job.git
使用idea打开xxl-job:
从项目中找到tables_xxl_job.sql,并执行其中的sql,执行后会在MySQL中创建xxl_job库以及相关配置表:
修改xxl-job-admin配置文件application.properties:
主要修改数据库连接username和passwrod,以及端口(可以自定义也可以使用默认端口):
找到XxlJobAdminApplication.java 运行xxl-job-admin:
pom文件:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.4.RELEASE
org.example
xxl-job-executor
1.0-SNAPSHOT
jar
xxl-job-executor
http://maven.apache.org
UTF-8
org.springframework.boot
spring-boot-starter-web
com.xuxueli
xxl-job-core
2.4.0
org.springframework.boot
spring-boot-starter
JobExecutorApplication.java
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello xxl-job!
*/
@SpringBootApplication
public class JobExecutorApplication {
public static void main(String[] args) {
SpringApplication.run(JobExecutorApplication.class, args);
}
}
添加xxl-job相关配置XxlJobConfig.java:
package org.example.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;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
public class XxlJobConfig {
private static final Logger log = 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() {
log.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;
}
}
添加调度任务HelloJobHandler
package org.example.handler;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class HelloJobHandler {
private final static Logger log = LoggerFactory.getLogger(HelloJobHandler.class);
@XxlJob("helloJob")
public ReturnT
项目文件配置
server:
port: 8081
xxl:
job:
admin:
enable: true
username: admin
password: 123456 # xxl-job-admin 默认密码
addresses: http://172.24.192.1:8079/xxl-job-admin # 调度中心地址
executor:
appname: xxl-job-admin
address: http://172.24.192.1:9999/
ip:
port: 9999 # 用来与调度中新通信的端口号
logretentiondays: 10
accessToken: default_token
运行xxl-job-executor
进入xxl-job-admin调度中心控制台:http://127.0.0.1:8079/xxl-job-admin/,默认用户名密码:admin/123456
新建执行管理器
新增任务
上图中,基础配置信息除了执行器外根据跟人具体情况填写.调度配置选择cron,cron表达式可根据实际业务需求自行调整.运行模式选择Bean,jobHandler使用上一步中的@XxlJob内的注解名称.路由策略使用第一个(当有多个执行器时始终使用第一个执行任务).
执行任务
这里我执行了两次任务,第一次失败,第二次成功:
失败原因:第一次执行的时候没有指定执行器地址.需要在执行的时候指定执行器地址:
或者使用执行器管理中的地址
调度器后台输出
上面调度任务只实现了始终使用第一个调度器执行的调度方式.其他方式还包括:
LAST(最后一个):固定选择最后一个机器;
ROUND(轮询):;
RANDOM(随机):随机选择在线的机器;
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;