github地址:https://github.com/xuxueli/xxl-job/
码云地址:https://gitee.com/xuxueli0323/xxl-job
业务场景
- 业务数据同步(线上数据同步到线下,新平台同步老平台)
- 消息通知(花呗账单,信用卡账单等)
什么是定时任务?
- 定时任务是指:基于给定的时间点、或者给定执行次数“自动执行”的程序。
常见的分布式任务调度框架
- xxl-job
- Elastic-job
- saturn
- lts
- TBSchedule
- cronsum
- Quartz等
一般定时任务的不足
- 不支持集群(会导致多次执行)
- 不支持任务重试(会导致程序执行多次)
- 不支持动态调用规则(自定义执行时间点,无法改变)
- 无报警机制(只能通过日志)
- 不支持生命周期的统一管理
- 任务数据难以统计
XXL-JOB定时任务
一、工作原理:
- “调度” 抽象成 “调度中心” 公共平台,自身不承担调度任务,只负责发起调度请求
- “任务” 抽象程分散的 JobHandler, 交由执行器统一管理,执行器负责接收调度请求并执行对应的JobHandler中的业务逻辑
因此,“调度” 和 “任务” 可以相互解耦
XXL-Job使用
1. 启动 xxl-job-admin
2. 开启一个springboot项目,并映入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mfg</groupId>
<artifactId>xxl-job_first_study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.7.3</version>
</dependency>
<!-- xxl-job定时任务jar -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
3. 配置 application.xml
logging:
level:
com:
mfg: [debug,info,error,debug]
config: classpath:logback.xml
server:
port: 8081
############### xxl-job 配置 #######################
# xxl.job.admin.addresses:
# xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
### xxl.job.accessToken=default_token ## 对应 xxl-job-admin服务中xxl.job.accessToken配置
accessToken: default_token
### xxl.job.executor.appname: xxl-job执行器名称,同一个应用多个节点使用同样的名称
executor:
appName: xxl-job-executor-mfg
address: #执行器自动生成
ip: # 执行器ip 执行器自动分配的
port: 9999 # xxl-job内部 执行器端口
logPath: /data/applogs/xxl-job/jobhandler # 执行器 日志路径
logRetentionDays: 30 # xxl-job-executor 执行器日志保留时间
4. 配置 logbak.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
5. 配置 xxl-job
package com.mfg.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; // xxl-job-admin服务
@Value("${xxl.job.accessToken}")
private String accessToken; // xxl-job-admin服务中的登录标签
@Value("${xxl.job.executor.appName}")
private String appName; // xxl-job 执行器名称,同一个应用多个节点使用相同的名称
@Value("${xxl.job.executor.address}")
private String address; // 执行器注册地址(xxl-job 可以自动生成)
@Value("${xxl.job.executor.ip}")
private String ip; // 执行器服务端口信息(executor server-info), 执行器可以自动生成
@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 xxlJobSpringExecutor(){
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
6. 写xxl-job实例
package com.mfg.task;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class XxlJobDemo {
@XxlJob(value = "xxlJobDemoTask")
public ReturnT xxlJobDemoTask(){
System.out.println("=============>>>>>>>>>>>>>>>>>>>Hello xxl-job !");
return ReturnT.SUCCESS;
}
}
并启动springboot这个服务
7. 创建一个执行器
- 任务管理
这里点击启动
- 管理台自动定时执行