跳到主要内容

采集数据的任务-数据的计算

在上一章中讲解了项目中责任链的数据的采集节点的执行过程,从本章节开始会详细讲解责任链中采集节点的下一个节点:数据的计算节点执行逻辑

计算节点

org.javaup.chain.impl.ComputerDataChainHandler

@Component
public class ComputerDataChainHandler extends AbstractDataChainHandler {

@Autowired
private ComputeHandler computeHandler;

@Override
protected void handler(final TotalParamTransfers totalParamTransfers) {
computeHandler.compute(totalParamTransfers);
}

@Override
protected Integer order() {
return 2;
}
}

计算节点中逻辑都交给了计算处理器computeHandler来处理

外层 compute

/** 进行计算
* @param totalParamTransfers 总参数传输对象
*/
public void compute(TotalParamTransfers totalParamTransfers) {
List<Map<String, Object>> resultDataList = totalParamTransfers.getResultDataList();
if (CollectionUtil.isEmpty(resultDataList)) {
return;
}
//需要计算的指标
List<Metric> computeMetricList = totalParamTransfers.getMetricList().stream().filter(metric ->
metric.getMetricCollectType().equals(MetricCollectType.COMPUTE.getCode())).toList();
if (CollectionUtil.isEmpty(computeMetricList)) {
return;
}
List<Metric> allMetricList = totalParamTransfers.getMetricList();
//所有的指标 key:指标名称,value:指标对象
Map<String, Metric> allMetricMap = allMetricList.stream().collect(Collectors.toMap(Metric::getMetricName, v -> v));
//遍历结果数据,进行计算
for (Map<String, Object> resultData : resultDataList) {
for (Metric computeMetric : computeMetricList) {
compute(allMetricMap,resultData,computeMetric);
}
}
}

方法整体流程(外层 compute)

1. 获取数据并验证

List<Map<String, Object>> resultDataList = totalParamTransfers.getResultDataList();
if (CollectionUtil.isEmpty(resultDataList)) {
return;
}
  • totalParamTransfers 取出 resultDataList(每条为 Map<String,Object> 的结果行)。
  • resultDataList 为空,直接返回。

2. 筛选需计算的指标

List<Metric> computeMetricList = totalParamTransfers.getMetricList().stream().filter(metric ->
metric.getMetricCollectType().equals(MetricCollectType.COMPUTE.getCode())).toList();
if (CollectionUtil.isEmpty(computeMetricList)) {
return;
}
  • metricList 里筛选 MetricCollectType.COMPUTE 类型的指标,也就是计算类型的指标,形成 computeMetricList
  • computeMetricList 为空,直接返回。

3. 构建指标索引表

List<Metric> allMetricList = totalParamTransfers.getMetricList();
//所有的指标 key:指标名称,value:指标对象
Map<String, Metric> allMetricMap = allMetricList.stream().collect(Collectors.toMap(Metric::getMetricName, v -> v));
  • 将全部指标 allMetricListmetricName 为 key 建立 allMetricMap,便于后续 O(1) 查找。

4. 双层遍历计算

for (Map<String, Object> resultData : resultDataList) {
for (Metric computeMetric : computeMetricList) {
compute(allMetricMap,resultData,computeMetric);
}
}
  • 外层遍历每一条 resultData(一行聚合后的上下文数据)。
  • 内层遍历每一个需要计算的指标 computeMetric
  • 对每对组合调用下层重载 compute(allMetricMap, resultData, computeMetric),把结果直接写回当前的 resultData