采集数据的任务-数据的升级
在上一章中讲解了项目中责任链的数据的保存节点的执行过程,当执行后会在数据库保存统计到的指标数据,由于是最开始执行的任务,所以数据是最基本的维度,存在了d_report_video_data_video_stats
表中,以其中一条数据为例,看一下表中数据结构:
id | rule_id | stats_time | video_type_id | parent_video_type_id | watch_like_rate | watch_count | watch_dislike_count | watch_dislike_rate | watch_like_count | watch_complete_count | watch_complete_rate | video_id |
---|---|---|---|---|---|---|---|---|---|---|---|---|
45 | 1 | 20250826 | 4 | 1 | 0.08 | 76 | 0 | 0.0 | 6 | 26 | 0.34 | 7762202481762402600 |
从本章节开始会详细讲解责任链中采集节点的下一个节点:数据的升级节点执行逻辑
数据升级的节点
org.javaup.chain.impl.UpgradeDimensionDataChainHandler#handler
protected void handler(TotalParamTransfers totalParamTransfers) {
//执行维度升级
ParamTransfers newParamTransfers = doUpgradeDimension(totalParamTransfers);
//如果newParamTransfers为空,说明维度已经升级到最高了,不需要再发型消息了
if (Objects.isNull(newParamTransfers)) {
return;
}
totalParamTransfers.setParamTransfers(newParamTransfers);
MessageProducerRecord messageProducerRecord = messageProducerRecordService.insertMessageProducerRecord(totalParamTransfers);
UpDimensionDomain upDimensionDomain = upgradeDimensionHandler.upgradeDimension(messageProducerRecord.getId(),
messageProducerRecord.getMessageId(),totalParamTransfers);
if (Objects.nonNull(upDimensionDomain.getDockDataCenterFrameException())) {
throw upDimensionDomain.getDockDataCenterFrameException();
}
}
一. 维度升级入口逻辑 doUpgradeDimension
public ParamTransfers doUpgradeDimension(TotalParamTransfers totalParamTransfers){
//视频维度
VideoDimensionType videoDimensionType = totalParamTransfers.getParamTransfers().getVideoDimensionType();
//时间类型
DateType dateType = totalParamTransfers.getParamTransfers().getRequestTime().getDateType();
//如果视频维度是父级的视频分类,并且时间维度是年维度,那么就不需要再进行升级了
if (videoDimensionType == VideoDimensionType.PARENT_VIDEO_TYPE && dateType == DateType.YEAR) {
log.info("一次的所有维度采集完成, 规则id:{}, 采集日期:{}", totalParamTransfers.getParamTransfers().getRuleId(),
totalParamTransfers.getParamTransfers().getRequestTime().getGatherDate());
return null;
}
//维度的升级
ParamTransfers newParamTransfers = upgradeDimensionParam(totalParamTransfers.getParamTransfers());
if (Objects.isNull(newParamTransfers)) {
return null;
}
log.info("维度升级执行,升级前的时间维度:{}, 升级前的视频维度:{}, 升级后的时间维度:{}, 升级后的视频维度:{}",
dateType.getMsg(), videoDimensionType.getMsg(),
newParamTransfers.getRequestTime().getDateType().getMsg(),
newParamTransfers.getVideoDimensionType().getMsg());
return newParamTransfers;
}
1. 读取当前维度:拿到当前的视频维度 videoDimensionType
与时间维度 dateType
。
//视频维度
VideoDimensionType videoDimensionType = totalParamTransfers.getParamTransfers().getVideoDimensionType();
//时间类型
DateType dateType = totalParamTransfers.getParamTransfers().getRequestTime().getDateType();
2. 终止条件一(全部完成):若已是“父级视频分类 + 年”这组最高维度,则记录日志并返回 null
。
//如果视频维度是父级的视频分类,并且时间维度是年维度,那么就不需要再进行升级了
if (videoDimensionType == VideoDimensionType.PARENT_VIDEO_TYPE && dateType == DateType.YEAR) {
log.info("一次的所有维度采集完成, 规则id:{}, 采集日期:{}", totalParamTransfers.getParamTransfers().getRuleId(),
totalParamTransfers.getParamTransfers().getRequestTime().getGatherDate());
return null;
}
3. 继续升级:否则调用 upgradeDimensionParam(paramTransfers)
执行具体升级。
//维度的升级
ParamTransfers newParamTransfers = upgradeDimensionParam(totalParamTransfers.getParamTransfers());