xxl-job进阶和原理分析

1.xxl-job任务执行流程

MethodJobHandler是处理java定时任务的方法,当我们用java开发了定时任务方法,然后用@XxlJob注解修饰方法,就可以调度该定时任务方法了。我们看看MethodJobHandler的execute方法是如何执行定时任务方法的。

//代码位置:com.xxl.job.core.handler.impl.MethodJobHandler#execute
public void execute() throws Exception {
        Class[] paramTypes = method.getParameterTypes();
        if (paramTypes.length > 0) {
            method.invoke(target, new Object[paramTypes.length]);       // method-param can not be primitive-types
        } else {
            method.invoke(target);
        }
}

可以看出MethodJobHandler的execute方法利用反射,获取定时任务的method,然后利用invoke执行定时任务方法。所以我们看到很多网站上给出的实战代码并没有重写execute方法,而是直接自定义了一个方法。因为MethodJobHandler的execute方法可以利用反射,获取定时任务的method。

2.出入参数

在最新版本的 xxl-job 中,任务核心类 “IJobHandler” 的 “execute” 方法取消出入参设计。改为通过 “XxlJobHelper.getJobParam” 获取任务参数并替代方法入参,通过 “XxlJobHelper.handleSuccess/handleFail” 设置任务结果并替代方法出参,示例代码如下

(这种情况就是在你需要传入参数,在函数中需要参数的时候,在最新版本中使用XxlJobHelper.getJobParam,运行成功或者异常报错用XxlJobHelper.handleSuccess/handleFail

@XxlJob("demoJobHandler")
public void execute() {
  String param = XxlJobHelper.getJobParam();    // 获取参数
  XxlJobHelper.handleSuccess();                 // 设置任务结果
}

3.xxl-job的集群部署

不过需要注意的是,XXL-JOB的集群不是分片集群,不管部署多少台,同一时间执行调度任务的只会有一台,集群部署纯粹只是为了处理单点故障问题,但是也不是单纯的主备关系。
从上面的配置中可以发现,XXL-JOB的集群中有节点宕机后并不会做选举,实际上XXL-JOB的每个节点都可以提供服务,只要不是所有节点一起宕机,就不会有单点故障的问题。

(注册的时候不同port可实现单机集群)

参考:xxl-job定时任务执行流程分析-任务执行 - 知乎 (zhihu.com)

分布式调度中间件xxl-job(四):执行器Executor--执行器的注册-腾讯云开发者社区-腾讯云 (tencent.com)

重复调度怎么处理呢?
重复调度问题一般是通过分布式锁来处理的,实现分布式锁的方式有很多,XXL-JOB选择的方式是通过数据库的锁来实现的。

调度性能如何保障的呢?
在XXL-JOB的架构中,调度器与执行器是分离的,并且所有的调度流程都实现了异步化,从而大大降低了调度中心的性能压力,所以一台调度中心服务器就可以满足要求了。

XXL-JOB的调度中心集群部署只需要满足两个条件:

  • 多个节点使用同一个数据库。
  • 多台机器的系统时间配置成一样的。

此外,可以通过反向代理服务器,配置调度中心的统一入口。

避免任务重复调度:

使用XXL-JOB时,如何避免多台服务器重复调度任务?|工作踩坑系列_程序员小彭的博客-CSDN博客

你可能感兴趣的:(Java开发,java,开发语言)