源码地址:https://gitee.com/xuxueli0323/xxl-job
文档地址:https://www.xuxueli.com/xxl-job/
目录
1.为什么使用Xxl-job?
当前软件的架构已经开始向分布式架构转变,将单体结构拆分为若干服务,服务之间通过网络交互来完成业务处理。在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,如果在这种分布式系统环境下运行任务调度,同一个任务调度可能会执行多次,例如:电商系统定期发放优惠券,就可能重复发放优惠券,对公司造成损失,信用卡还款提醒就会重复执行多次,给用户造成烦恼,所以我们需要控制相同的任务在多个运行实例上只执行一次,所以Xxl-job就是为了解决这个问题出现了。
2.环境部署——docker安装
1.创建mysql容器,初始化xxl-job的SQL脚本
docker run -p 3306:3306 --name mysql57 \
-v /opt/mysql/conf:/etc/mysql \
-v /opt/mysql/logs:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
2.拉取镜像
docker pull xuxueli/xxl-job-admin:2.3.0
3.创建容器
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://192.168.200.130:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 \
--spring.datasource.username=root \
--spring.datasource.password=root" \
-p 8888:8080 -v /tmp:/data/applogs \
--name xxl-job-admin --restart=always -d xuxueli/xxl-job-admin:2.3.0
3.快速入门案例
1.调度中心创建==》执行器管理
2.创建任务选中创建的执行器
3.创建定时任务
4.POM.XML===>Xxl-job
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
5.application.yml
xxl:
job:
admin:
#调度中心地址端口
addresses: http://192.168.200.130:8888/xxl-job-admin
executor:
#执行器名称
appname: xxl-job-executor-sample
# 执行器的端口
port: 9999
6.Spring集成Xxl-job,引入配置文件中设置的
@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.port}")
private int port;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
return xxlJobSpringExecutor;
}
}
7.测试
/**
* @author JiaWei
*/
@Component
public class demoJobHandler {
/**
将调度中心的任务名称进行引用
*/
@XxlJob("demoJobHandler")
public void hello(){
System.out.println("任务执行");
}
}
4.各个步骤详解
1.执行器管理
每一个定时任务都有一个执行器起到一个分区的分组的作用
2.任务管理
详解