分布式定时任务(xxl-job)
分布式中怎么进行定时任务调度。xxl-job是什么,怎么使用 配置
简介
什么是XXL-JOB
详细的文档类容可以看下面这个链接进入readme
xxl-job简介以及下载地址
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展
在Java Spring Cloud微服务架构中,使用独立的定时任务调度中心(如XXL-JOB、Elastic-Job等)来统一管理所有定时任务,是一种更符合分布式系统设计原则的最佳实践。以下是详细的解释和关键点:
为什么推荐集中式调度(XXL-JOB)而不是@Scheduled?
以前的单机springboot项目的时候咱们执行定时任务就是加上@Scheduled注解
但是随着项目增大,单实例的项目资源就不够用了,这时候有些公司就会在同一台服务器部署多实例项目,通过负载均衡,减少了单实例(也可以理解为一台jvm本身资源的限制问题),但是在定时任务过程中会遇到多实例多次调用定时任务的问题,解决办法呢也不难,加上分布式锁就行了,例如redisson加锁,让同一时间只有一个任务能执行。
这样问题是解决了,但是项目随着时间又急速扩大,这时候服务越来越多,形成了多个微服务,这时候项目逐渐转型为springcloud,那么现在手动添加的@scheduled的定时任务就太分散了,不利于管理。
因此xxl-job应运而生。
xxl-job的运行方式
简单点来说就是在xxl-job服务中调用其他服务器的远程接口
+------------------+
| XXL-JOB Admin |
+------------------+
|
| (调度HTTP/RPC)
v
+------------------+ +------------------+ +------------------+
| Order Service| | Payment Service | | Inventory Service|
| (提供任务执行接口)| | (提供任务执行接口)| | (提供任务执行接口)|
+------------------+ +------------------+ +------------------+
安装
首先下载源码,简介中已经提供地址,下面是项目目录
数据库

导入数据之后结构如下,下面就是什么日志,用户表一些东西
控制台
看源码这一部分
可以看见这就是一个典型的web项目,这里的就是登陆接口,和前端代码
自己配置ip端口号
这里启动可以是本地jar,也可以是用docker
启动之后的控制台如下
控制台主要内容就是任务管理和执行器管理
执行器管理:
个人理解就是xxl-job注册的服务器,看那些任务用哪台服务器执行
任务管理:
配置定时任务
控制台的主要功能在文档中写得很清楚这里就不再赘述。
任务调度
这里代码就给了我们一个示例
实际情况我们应该重新创一个项目,相当于前端控制台是一个服务,后端任务调度是一个服务
创建任务调度服务

基础文件直接照搬xxl-job中的示例就行
主要的配置就两个 一个xxljobconfig,一个定时任务
xxljobConfig
package com.xxl.job.executor.core.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.admin.accessToken}")
private String accessToken;
@Value("${xxl.job.admin.timeout}")
private int timeout;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@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 xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setTimeout(timeout);
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();
*/
}
@XxlJob代表创建的定时调度对象,后续会在控制台注册,定时执行的程序就需要用到dubbo远程调度其他服务
@Component
public class EquipmentCalibrationCreatHandler {
@DubboReference(validation = "false",retries = 2)
private EquipmentRpcService equipmentRpcService;
private static final Logger logger = LoggerFactory.getLogger(EquipmentCalibrationCreatHandler.class);
@XxlJob("equipmentCalibrationCreatHandler")
public ReturnT<String> equipmentCalibrationCreatHandler(String param){
XxlJobHelper.log("equipmentCalibrationCreatHandler start........");
try {
equipmentRpcService.handleEquipmentCalibration();
}catch (Exception e){
XxlJobHelper.log("equipmentCalibrationCreatHandler error........");
XxlJobHelper.log(e);
logger.error(e.getMessage());
return ReturnT.FAIL;
}
XxlJobHelper.log("equipmentCalibrationCreatHandler end........");
return ReturnT.SUCCESS;
}
}
配置完后绑定执行器
打开控制台-》任务管理:新增任务
完成!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)