前往小程序,Get更优阅读体验!
立即前往
发布

XXL-JOB

作者头像
ma布
发布2024-11-15 08:26:04
发布2024-11-15 08:26:04
8400
代码可运行
举报
文章被收录于专栏:Java开发
运行总次数:0
代码可运行

Github 地址: https://github.com/xuxueli/xxl-job/ 。

官⽅介绍: https://www.xuxueli.com/xxl-job/ 。

XXL-JOB 于 2015 年开源,是⼀款优秀的轻量级分布式任务调度框架,⽀持任务可视化管理、弹性 扩容缩容、任务失败重试和告警、任务分⽚等功能。关于XXL-JOB的特性可以参考下图(图片来自JavaGuid)

XXL-JOB的架构图如下:

从上图可以看出, XXL-JOB 由 调度中⼼ 执⾏器 两⼤部分组成。调度中⼼主要负责任务管理、

执⾏器管理以及⽇志管理。执⾏器主要是接收调度信号并处理。另外,调度中⼼进⾏任务调度时,是通过⾃研 RPC 来实现的。

不要被 XXL-JOB 的架构图给吓着了,实际上,我们要⽤ XXL-JOB 的话,只需要重写 IJobHandler ⾃定义任务执⾏逻辑就可以了,⾮常易⽤!

代码语言:javascript
代码运行次数:0
复制
@JobHandler(value="myApiJobHandler")
@Component
public class MyApiJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
//......
return ReturnT.SUCCESS;
 }
}

还可以直接基于注解定义任务。

代码语言:javascript
代码运行次数:0
复制
@XxlJob("myAnnotationJobHandler")
public ReturnT<String> myAnnotationJobHandler(String param) throws Exception {
//......
return ReturnT.SUCCESS;
}

在Spring中导入依赖即可

代码语言:javascript
代码运行次数:0
复制
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>1.8.2</version>
</dependency>

配置application.yml文件

代码语言:javascript
代码运行次数:0
复制
xxl:
  job:
    executor:
      appname: ${spring.application.name}
      logpath: ${spring.application.name}/xxl-job
      logretentiondays: 30
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    accessToken: default_token
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

添加执行器到IOC容器中

代码语言:javascript
代码运行次数:0
复制
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${server.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setPort(port + 10000);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

添加执行任务

代码语言:javascript
代码运行次数:0
复制
@XxlJob("testJob")
public void testJob(){
    System.out.println("执行 xxl job");
}

在web端手动添加任务执行

路由策略如下:

  1. 第一个:选取执行器管理的注册地址列表中的第一个执行器来执行任务;
  2. 最后一个:选取执行器管理的注册地址列表中的最后一个执行器来执行任务;
  3. 轮询:依次选取执行器管理的注册地址列表中的执行器,周而复始。为了应对多个定时任务同时触发带来的数据一致性问题,XXL-JOB 使用一个静态的同步 Map 来存储每个任务的 jobId 和其对应的计数。每次计数增加后,对执行器地址列表的数量取余,将结果作为索引来获取对应的执行器地址。如果超过 24 小时没有触发调用该任务,会清空 Map 以释放一定空间;
  4. 随机:从执行器管理的注册地址列表中随机选取一个执行器来执行任务;
  5. 一致性 HASH:实现一致性 HASH 负载均衡算法;
  6. 最不经常使用:选择最近最少被调度的执行器执行任务(通过次数维度选取任务);
  7. 最近最久未使用:选择距离上次被调度时间最长的执行器执行任务(通过时间维度选取任务),有助于平衡各执行器的工作负载;
  8. 故障转移:在任务路由策略选择“故障转移”的情况下,如果执行器集群中的某一台机器出现故障,将会自动 Failover 切换到一台正常的执行器发送调度请求;
  9. 忙碌转移:当任务分配到某个执行器时,如果该执行器正处于忙碌状态(可能正在执行其他任务或资源紧张),则会尝试将任务转移到其他相对空闲的执行器上执行;
  10. 分片广播:选取执行器管理的注册地址列表中的所有地址,每个地址都执行一次任务。这种方式类似于 MQ 的广播模式,可以将任务广播到集群中的所有执行器上执行。此策略适用于需要在多个执行器上同时执行相同任务的场景,例如数据同步或分布式计算等。

之后控制台开启任务即可。 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档