1.xxl-job介绍
1.1.1 xxl-job是什么
1.XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
它是大众点评公司的许雪里开发出来的框架。
2、发展
在2015年中,由许雪里大神在github上创建XXL-Job项目仓库并提交第一个commit,在2015年11月,XXL-JOB框架RELEASE了第一个大版本V1.0,之后也登上了各大榜单,具体发展史可以看官网中的详细介绍,下面附有官网地址。现在很多公司都集成了该框架。
XXL 也正是大神许雪里名字的缩写。
1.1.2 xxl-job的特性
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
3、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
4、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
5、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务
6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行
7、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
8、任务进度监控:支持实时监控任务进度;
3.3.3 xxl-job的几个角色
原生定时任务的概念:
- 调度器 :负责对用户定义的所有任务进行调度。
- 触发器 : 触发器在逻辑上包含两个属性,即如何触发该调度器和触发该调度器之后进行怎么样的操作
- 任务 : 触发器在被触发后进行的操作,可以指定任意一个类的某个方法。
资源可以上马云上拉取
执行下方的sql脚本
下载的代码在idea打开,修改配置文件,这个数据库地址是刚刚跑的sql数据库地址
spring.datasource.url=jdbc:mysql://172.16.147.129:3306/xxl_job?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
日志配置文件那个路径加一个点
启动类测试测试运行:http://localhost:8080/xxl-job-admin/
账号密码: “admin/123456”
可以把这个项目打包到服务器后台运行
在Spring Boot中项目使用
1.pom中引入依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.2</version>
</dependency>
2.添加配置类
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath:abc}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppName(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
3.配置yml
#######xxl-job######
xxl:
job:
accessToken: ''
admin:
addresses: http://localhost:8080/xxl-job-admin
executor:
appname: admin
ip: 127.0.0.1
logretentiondays: 30
port: 19999
4.编写任务代码
/**
* @author zengfl
* @Date 下午4:09
* @User 添砖Java的亮哥
*/
@Component
public class TestTesk {
@XxlJob("testTask")
public ReturnT<String> testTask(String param){
System.out.println("执行成功");
System.out.println(param);
return ReturnT.SUCCESS;
}
}
调度中心配置
保存后执行看看效果
容器部署命令
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://192.168.211.128:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456 --spring.datasource.driver-class-name=com.mysql.jdbc.Driver" -p 18080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d --restart=always xuxueli/xxl-job-admin:2.1.2
3.4 小结
我们实现了xxl-job的安装和入门任务调用。
-
执行器 (微服)
- 配置 appName 必须与xxl-job-admin平台上的执行器的appName一致
- 配置ip与port, ip必须能ping通, port 不能超过65000
- xxl-job-admin的地址 http://ip:8080/contextPath
- 写代码的地址
- @XxlJob(“jobHandler”)
- 返回值 ReturnT, return ReturnT.SUCCESS
- 平台日志:XxlJobLogger.log
- 本地日志: @Sl4j
-
xxl-job-admin平台
- 安装,执行sql脚本,配置数据库所在ip, 用户名密码
- 创建执行器, 指定appName
- 创建任务, 指定jobHandler
- 看执行日志、调度日志
4.0Spring定时任务入门
使用springboot来实现后台定时任务,只需以下三个注解即可
- @EnableScheduling 开启定时任务支持
- @Component 注册任务类
- @Scheduled 指定任务类方法执行时机
4.1 创建工程并引入依赖
创建工程名称:springtaskdemo
依赖如下:
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
4.2 创建启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @version 1.0
* @description 说明
* @package
*/
@SpringBootApplication
@EnableScheduling// 调度器
public class SpringTaskApp {
public static void main(String[] args) {
SpringApplication.run(SpringTaskApp.class, args);
}
}
4.3 创建任务类
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalTime;
/**
* @version 1.0
* @description 说明
* @package
*/
@Component
public class MyJob {
// cronExpression 七子表达式 秒 分 时 日 月 周 年。 日与周必须有一个为? 不能是过去的时间
// 定时执行,过时不执行。
// 例子: 0/2 * * * * ? 从0秒开始 每2秒执行一次
// @Scheduled(cron = "0/3 * * * * ?")// 触发器 CronTrigger
// jobHandler 任务处理器
// SimpleTrigger 启动后一定执行,与时间点无关
// initialDelay:启动后延迟多长时间后执行, fixedRate:执行的间隔周期, 每间隔多长时间后再执行
@Scheduled(initialDelay = 1000, fixedRate = 2000)
public void doMyJob(){
System.out.println(LocalTime.now().toString());
}
}
4.4 测试
运行启动类即可