采集数据的任务-数据的计算
在上一章中讲解了项目中责任链的数据的采集节点的执行过程,从本章节开始会详细讲解责任链中采集节点的下一个节点:数据的计算节点执行逻辑
计算节点
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。
付费内容提示
该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放
加入星球后,你可以获得:
- 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
- 讲解文档:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的550+详细文档
- 讲解视频:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
- 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
- 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
- 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
- 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
- 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
- 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
