1. 前言
XXL-JOB
可实现分布式定时任务。
由调度中心和执行器组成。
2. 调度中心
2.1 下载xxl-job-admin
git clone https://github.com/xuxueli/xxl-job.git
2.2 初始化表结构
数据库脚本地址:/xxl-job/doc/db/tables_xxl_job.sql
2.3 修改application.properties
server.port=18080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
2.4 修改logback.xml
<property name="log.path" value="logs/xxl-job/xxl-job-admin.log"/>
2.5 启动调度中心
Run XxlJobAdminApplication
打开浏览器:http://localhost:18080/xxl-job-admin/toLogin
默认账户密码:admin/123456
3. 执行器
在自己的Spring Boot
中引入xxl-job
,目前最新版本是2.2.1-SNAPSHOT
。
3.1 引入
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${xxl-job.version}</version>
</dependency>
3.2 配置
3.2.1 application.yml
添加xxl-job
配置。
xxl:
job:
# 执行器通讯TOKEN [选填]:非空时启用;
access-token:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
address: http://localhost:18080/xxl-job-admin
executor:
# 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
app-name: spring-boot-demo-task-xxl-job-executor
# 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
ip:
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
log-path: logs/spring-boot-demo-task-xxl-job/task-log
# 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;
log-retention-days: -1
3.2.2 XxlJobProps
@Data
@ConfigurationProperties(prefix = "xxl.job")
public class XxlJobProps {
/**
* 调度中心配置
*/
private XxlJobAdminProps admin;
/**
* 执行器配置
*/
private XxlJobExecutorProps executor;
/**
* 与调度中心交互的accessToken
*/
private String accessToken;
@Data
public static class XxlJobAdminProps {
/**
* 调度中心地址
*/
private String address;
}
@Data
public static class XxlJobExecutorProps {
/**
* 执行器名称
*/
private String appName;
/**
* 执行器 IP
*/
private String ip;
/**
* 执行器端口
*/
private int port;
/**
* 执行器日志
*/
private String logPath;
/**
* 执行器日志保留天数,-1
*/
private int logRetentionDays;
}
}
3.2.3 XxlJobConfig
import com.xkcoding.task.xxl.job.config.props.XxlJobProps;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@EnableConfigurationProperties(XxlJobProps.class)
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class XxlJobConfig {
private final XxlJobProps xxlJobProps;
//@Bean(initMethod = "start", destroyMethod = "destroy")
@Bean //移除init and destroy ,解决报错:Address already in use: bind
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(xxlJobProps.getAdmin().getAddress());
xxlJobSpringExecutor.setAccessToken(xxlJobProps.getAccessToken());
xxlJobSpringExecutor.setAppname(xxlJobProps.getExecutor().getAppName());
xxlJobSpringExecutor.setIp(xxlJobProps.getExecutor().getIp());
xxlJobSpringExecutor.setPort(xxlJobProps.getExecutor().getPort());
xxlJobSpringExecutor.setLogPath(xxlJobProps.getExecutor().getLogPath());
xxlJobSpringExecutor.setLogRetentionDays(xxlJobProps.getExecutor().getLogRetentionDays());
return xxlJobSpringExecutor;
}
}
3.3 添加一个定时任务
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class DemoTask extends IJobHandler {
/**
* execute handler, invoked when executor receives a scheduling request
*
* @param param 定时任务参数
* @return 执行状态
* @throws Exception 任务异常
*/
@Override
@XxlJob("demoTask")
public ReturnT<String> execute(String param) throws Exception {
// 可以动态获取传递过来的参数,根据参数不同,当前调度的任务不同
log.info("【param】= {}", param);
XxlJobLogger.log("demo task run at : {}", DateUtil.now());
return RandomUtil.randomInt(1, 11) % 2 == 0 ? SUCCESS : FAIL;
}
}
3.4 启动执行器
Run SpringBootDemoTaskXxlJobApplication
4. 调度中心配置执行器
4.1 添加执行器
4.2 添加任务
4.3 启动任务
4.4 查看日志
执行器控制台输出: