Part2今日主题:xxl-job分布式定时任务
XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。一般微服务都用这个框架的定时任务吧。
刚好公司新项目中用到了这个东西,然后这个分布式定时任务的技术选择也交给了我,包括将该技术整合到项目中,今天就来记录一下这个如何整合的吧。
1下载xxl-job
首先我们要将项目下载下来
git clone https://github.com/xuxueli/xxl-job.git
下载下来之后有这几个模块,直接启动admin模块就可以进入后台了
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用,推荐这种方式;xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器;xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;
我就直接选择springboot的执行器了
2导入脚本
将doc目录下的脚本打到数据库中
3修改数据库账号密码
在这里插入图片描述
4添加定时任务业务类
在这里插入图片描述
5执行器名称要对应
在执行器管理里面添加对应的执行器管理机器地址可以不用写,会自动注册。如果没有执行器则要新增执行器
6添加定时任务
新增定时任务执行一下,发现可以成功了。OK,这样就完成了简单的启动。
7项目中整合
官方的xxl-job-executor-sample-jboot
其实就是我们微服务中的一个模块,因此我们可以在我们自己项目引入依赖:
<!--xxj-job核心依赖--> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>
其实我就可以创建一个xxl-job的公共模块,创建一个配置类:
public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.addresses}") private String adminAddresses;
@Value("${xxl.job.accessToken}") private String accessToken;
@Value("${xxl.job.appname}") private String appname;
@Value("${xxl.job.address}") private String address;
@Value("${xxl.job.ip}") private String ip;
@Value("${xxl.job.port}") private int port;
@Value("${xxl.job.logpath}") private String logPath;
@Value("${xxl.job.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.setAddress(address); xxlJobSpringExecutor.setIp(ip); //在項目端口的基础上向右偏移1000端口,这样可以兼容所有模块的项目 xxlJobSpringExecutor.setPort(port+1000); xxlJobSpringExecutor.setAccessToken(accessToken); 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(); */
}
在该模块中引入依赖:
<!--xxj-job核心依赖--> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>
然后我们可以在自己的模块中引入xxl-job模块创建一个task类就行了,引入@Xxl-job,配置一个Handler,在后台添加一下就好了。nacos配置:
# xxl-joblogging: config: classpath:logback.xmlxxl: job: accessToken: "" addresses: http://127.0.0.1:9207/xxl-job-admin address: "" appname: ${spring.application.name} ip: "" logpath: /data/applogs/xxl-job/jobhandler logretentiondays: 30 port: ${server.port}
也就是在xxl-job官网文档上,我们只需要admin这个模块就行了。
欢迎关注:java后端指南