背景
当前软件的架构已经向分布式架构转变,在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,这时候就需要分布式任务调度框架来运行任务调度
XXL-JOB
xxl-job是大众点评的分布式任务调度平台,开发迅速,学习简单,轻量级,易扩展都是它的特性,开箱即用,
作用:统一管理任务调度平台上的调度任务,负责触发调度执行,并且提供任务管理平台,无需修改代码既可以更改调度时间,耦合降低
特性:高性能,高可用,丰富的任务管理功能,易于监控运维
源码地址如下:
xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。https://gitee.com/xuxueli0323/xxl-job 将源码拉取到idea,查看XXL-JOB的源码,进行简单解析即可上手使用
使用场景
1.支付宝固定每个月哪天提醒你还花呗,就是需要用到任务调度
2.一些新闻类资讯app,为了提高加载速度而使用redis存储文章数据,可能会在半夜进行缓存的数据更新,也是需要用到任务调度
安装
配置和部署调度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
启动容器之后访问虚拟机ip:端口/xxl-job-admin即可查看,默认登录账号是“admin/123456”
xxl-job入门案例编写
1.登录调度中心,新建示例任务
2.创建xxljob-demo项目,导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--xxl-job-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
3.yml配置文件的配置
server:
port: ${port:8881} #动态的端口
xxl:
job:
admin:
addresses: http://192.168.200.130:8888/xxl-job-admin #调度中心的访问地址
executor:
appname: xxl-job-executor-sample #执行器名称
port: ${executor.port:9999} #动态的,用于集群情况下配置不同的端口
4.新建配置类,配置类是直接复制源码中的config
package com.afu.xxljob.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 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;
}
}
5.编写任务代码,注意一个重要的注解@XxlJob("JobHandle")
package com.afu.xxljob.job;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class HelloJob {
@XxlJob("demoJobHandler")//对应调度中心的任务配置的JobHandler
public void helloJob(){
System.out.println("简单任务执行了。。。。");
}
}
6.测试:1.启动xxl-job容器 2.在xxl-job调度中心中启动任务即可完成入门案例