datax(15):源码解读AbstractCollector

datax 专栏收录该内容
28 篇文章 13 订阅

前面看了通讯类communication,容器类container,今天继续看他们两个是如何关联起来的。


一、概述AbstractCollector

1、主要作用:

 1. 将communication和container进行关联起来;
 2.  收集task信息;

2、族谱

目前整个家族只有父子二人,AbstractCollector和ProcessInnerCollector,且大部分事情都是父亲AbstractCollector干了。
在这里插入图片描述


二、主要属性

  /**
   * taskCommunicationMap用于保存Task注册到TaskGroupContainer,当Task注册到TaskGroupContainer的时候将
   * TaskId和新建的Communication对象保存进taskCommunicationMap即可。
   */
  private Map<Integer, Communication> taskCommunicationMap = new ConcurrentHashMap<>();

三、主要方法

1、父类AbstractCollector中
主要有 3个方法

 1. registerTGCommunication 将TaskGroupContainer注册到JobContainer
 2. registerTaskCommunication将Task注册到TaskGroupContainer
 3. collectFromTask收集所有task信息

registerTGCommunication
registerTGCommunication的运行时序图
在这里插入图片描述

 /**
   * 将TaskGroupContainer注册到JobContainer <br>
   * StandAloneJobContainerCommunicator将taskGroup的cfgs传入该类,该方法将taskGroupID和 comm
   * 托管到LocalTGCommunicationManager
   *
   * @param taskGroupConfigurationList List<Configuration>
   */
  public void registerTGCommunication(List<Configuration> taskGroupConfigurationList) {
    for (Configuration config : taskGroupConfigurationList) {
      int taskGroupId = config.getInt(CoreConstant.DATAX_CORE_CONTAINER_TASKGROUP_ID);
      LocalTGCommunicationManager.registerTaskGroupCommunication(taskGroupId, new Communication());
    }

registerTaskCommunication
registerTaskCommunication的运行时序图
在这里插入图片描述

  /**
   * Task注册到TaskGroupContainer
   *
   * @param taskConfigurationList List<Configuration>
   */
  public void registerTaskCommunication(List<Configuration> taskConfigurationList) {
    for (Configuration taskConfig : taskConfigurationList) {
      int taskId = taskConfig.getInt(CoreConstant.TASK_ID);
      this.taskCommunicationMap.put(taskId, new Communication());
    }
  }

collectFromTask
collectFromTask的运行时序图
在这里插入图片描述

  /**
   * 收集所有task信息
   *
   * @return Communication
   */
  public Communication collectFromTask() {
    Communication communication = new Communication();
    communication.setState(State.SUCCEEDED);

    for (Communication taskCommunication : this.taskCommunicationMap.values()) {
      communication.mergeFrom(taskCommunication);
    }
    return communication;
  }

2、子类ProcessInnerCollector
目前只有一个方法 collectFromTaskGroup 收集所有taskGroup的信息给tgManager

collectFromTaskGroup

  /**
   * 收集所有taskGroup的信息给tgManager
   *
   * @return Communication
   */
  @Override
  public Communication collectFromTaskGroup() {
    return LocalTGCommunicationManager.getJobCommunication();
  }

四、完整注释代码

AbstractCollector

/**
 * 状态收集器
 */
public abstract class AbstractCollector {

  /**
   * taskCommunicationMap用于保存Task注册到TaskGroupContainer,当Task注册到TaskGroupContainer的时候将
   * TaskId和新建的Communication对象保存进taskCommunicationMap即可。
   */
  private Map<Integer, Communication> taskCommunicationMap = new ConcurrentHashMap<>();

  private Long jobId;

  public Map<Integer, Communication> getTaskCommunicationMap() {
    return taskCommunicationMap;
  }

  public Long getJobId() {
    return jobId;
  }

  public void setJobId(Long jobId) {
    this.jobId = jobId;
  }

  /**
   * 将TaskGroupContainer注册到JobContainer <br>
   * StandAloneJobContainerCommunicator将taskGroup的cfgs传入该类,该方法将taskGroupID和 comm
   * 托管到LocalTGCommunicationManager
   *
   * @param taskGroupConfigurationList List<Configuration>
   */
  public void registerTGCommunication(List<Configuration> taskGroupConfigurationList) {
    for (Configuration config : taskGroupConfigurationList) {
      int taskGroupId = config.getInt(CoreConstant.DATAX_CORE_CONTAINER_TASKGROUP_ID);
      LocalTGCommunicationManager.registerTaskGroupCommunication(taskGroupId, new Communication());
    }
  }

  /**
   * Task注册到TaskGroupContainer
   *
   * @param taskConfigurationList List<Configuration>
   */
  public void registerTaskCommunication(List<Configuration> taskConfigurationList) {
    for (Configuration taskConfig : taskConfigurationList) {
      int taskId = taskConfig.getInt(CoreConstant.TASK_ID);
      this.taskCommunicationMap.put(taskId, new Communication());
    }
  }

  /**
   * 收集所有task信息
   *
   * @return Communication
   */
  public Communication collectFromTask() {
    Communication communication = new Communication();
    communication.setState(State.SUCCEEDED);

    for (Communication taskCommunication : this.taskCommunicationMap.values()) {
      communication.mergeFrom(taskCommunication);
    }
    return communication;
  }

  /**
   * 从tg里收集comm信息
   *
   * @return communication
   */
  public abstract Communication collectFromTaskGroup();

  public Map<Integer, Communication> getTGCommunicationMap() {
    return LocalTGCommunicationManager.getTaskGroupCommunicationMap();
  }

  public Communication getTGCommunication(Integer taskGroupId) {
    return LocalTGCommunicationManager.getTaskGroupCommunication(taskGroupId);
  }

  public Communication getTaskCommunication(Integer taskId) {
    return this.taskCommunicationMap.get(taskId);
  }
}

ProcessInnerCollector

public class ProcessInnerCollector extends AbstractCollector {

  public ProcessInnerCollector(Long jobId) {
    super.setJobId(jobId);
  }

  /**
   * 收集所有taskGroup的信息给tgManager
   *
   * @return Communication
   */
  @Override
  public Communication collectFromTaskGroup() {
    return LocalTGCommunicationManager.getJobCommunication();
  }

}


注:

  1. 对源码进行略微改动,主要修改为 1 阿里代码规约扫描出来的,2 clean code;

  2. 所有代码都已经上传到github(master分支和dev),可以免费白嫖

  • 2
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值