Elastic-Job源码解析(一)之与Spring完美整合

西魏陶渊明 ... 2022-8-22 Java 大约 2 分钟

看过小编写SpringFramework源码解析的同学应该对Spring支持自定义标签还有点印象吧,没有的话我们回顾下,然后看看Elastic-Job是如何巧妙的利用自定义标签生成Job任务的吧。请注意这里用了一个巧妙关键字。我们看它如何巧妙的吧。

# Elastic Job 自定义标签原理

在Spring中实现自定义标签只用继承NamespaceHandlerSupport类,然后定义自己的BeanDefinitionParse来生成BeanDefinition就可以了。就会被Spring的IOC容器加载到了。

/**
 * 分布式作业的命名空间处理器
 */
public final class JobNamespaceHandler extends NamespaceHandlerSupport {
    public JobNamespaceHandler() {
    }

    public void init() {
        this.registerBeanDefinitionParser("simple", new SimpleJobBeanDefinitionParser());
        this.registerBeanDefinitionParser("dataflow", new DataflowJobBeanDefinitionParser());
        this.registerBeanDefinitionParser("script", new ScriptJobBeanDefinitionParser());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
类型 解析器 描述
simple SimpleJobBeanDefinitionParser 一般任务
dataflow DataflowJobBeanDefinitionParser 数据流任务
script ScriptJobBeanDefinitionParser 脚本任务

注册中心解析器

public final class RegNamespaceHandler extends NamespaceHandlerSupport {
    public RegNamespaceHandler() {
    }

    public void init() {
        this.registerBeanDefinitionParser("zookeeper", new ZookeeperBeanDefinitionParser());
    }
}
1
2
3
4
5
6
7
8
  • 在jar中添加 /META-INF/spring.handler 指定文件的解析器
  • 在jar中添加 /META-INF/spring.schemas 指定文件的xml约束信息

# Elastic-Job如何巧妙?

注意: 定时任务 = 定时器 + 任务 Elastic Job只给我们提供了任务标签,所以我们平时用Elastic-Job写的只是一个任务,而不是一个Bean。另外关于标签的属性,即: 定时的信息,是以属性配置的形式放在xml中的,我们可以看xsd文件约束中找到,都有哪些属性可以用,下图

Elastic-Job会解析我们的xml任务信息,并通过定时的相关参数,生成SpringJobScheduler对象,在哪里进行着一操作呢? 感觉很怪异,找了很久才找到,竟然在每个任务的解析器中。为什么这么说呢? 因为实现都在抽象类中生成。

所有的任务解析器都实现了一个抽象方法AbstractJobBeanDefinitionParser。而在这里面对我们写的job标签进行了解析生成job对象,作为属性注入到SpringJobScheduler中,在init方法中,开始执行定时 任务(quartz)。

其实BeanDefinitionParse的主要职责是解析Bean对象的,而Elastic-Job巧妙的用来生成SpringJobScheduler。 由此联想到Es Job的标签都是 job:{taskType}开头的,看来命名真的很有技巧,注意他不是一个bean而是SpringJobSchedulerBean的一个参数声明 ! 还能这么用! get 到一个新技能。

另外注意

  • ①: init初始化方法中完成定时任务的初始化操作,即开始定时,底层还是使用的quartz的一个封装
  • ②: shutdown回收资源,关闭线程池

本文由西魏陶渊明版权所有。如若转载,请注明出处:西魏陶渊明
上次编辑于: 2022年8月22日 09:35
贡献者: lxchinesszz