跳到主要内容

采集数据的任务-数据的升级

在上一章中讲解了项目中责任链的数据的保存节点的执行过程,当执行后会在数据库保存统计到的指标数据,由于是最开始执行的任务,所以数据是最基本的维度,存在了d_report_video_data_video_stats表中,以其中一条数据为例,看一下表中数据结构:

idrule_idstats_timevideo_type_idparent_video_type_idwatch_like_ratewatch_countwatch_dislike_countwatch_dislike_ratewatch_like_countwatch_complete_countwatch_complete_ratevideo_id
45120250826410.087600.06260.347762202481762402600

从本章节开始会详细讲解责任链中采集节点的下一个节点:数据的升级节点执行逻辑

数据升级的节点

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());