采集数据的任务-数据的计算
在上一章中讲解了项目中责任链的数据的采集节点的执行过程,从本章节开始会详细讲解责任链中采集节点的下一个节点:数据的计算节点执行逻辑
计算节点
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));
- 将全部指标
allMetricList
以metricName
为 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
。