package com.iplatform.recvideo; import com.walker.infrastructure.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; public abstract class VideoLoader { protected final transient Logger logger = LoggerFactory.getLogger(this.getClass()); // protected String videoDataFolder = null; public void startup(boolean testMode){ // this.videoDataFolder = videoDataFolder; } public void destroy(){ } public int execute() throws Exception{ long nextBatchId = this.acquireNextBatchId(); if(nextBatchId == 0){ logger.debug("未找到下一个(已有)最大批次,说明还没有操作过,默认设置一个合理值做初始查询"); nextBatchId = this.acquireInitBatchId(); } List readyLoadList = null; try{ readyLoadList = this.acquireLoadVideoFromDatabase(nextBatchId); } catch (Exception ex){ logger.error("acquireLoadVideoFromDatabase(): " + ex.getMessage(), ex); return -1; } if(StringUtils.isEmptyList(readyLoadList)){ logger.debug("未查找到任何要远程获取的视频,readyLoadList = null"); return -1; } long savedBatchId = this.copyRemoteVideoFiles(readyLoadList, nextBatchId); logger.info("拷贝一批视频文件,共:" + readyLoadList.size() + "个, 返回最新 savedBatchId = " + savedBatchId); if(savedBatchId <= 0){ throw new IllegalArgumentException("生成的 savedBatchId 无效,无法继续后续采集: " + savedBatchId); } try{ this.saveDataAndStatus(readyLoadList, savedBatchId); return 1; } catch (Exception ex){ logger.error("saveDataAndStatus(),保存采集视频数据和状态失败:" + ex.getMessage(), ex); return -1; } } /** * 获取最大批次采集值,通常为时间戳,系统会使用该值去查找业务中超过该值的视频信息。 * @return */ protected abstract long acquireNextBatchId(); /** * 如果系统不存在已采集记录,则会自动初始化一个批次来采集,该值通常会较早 * @return */ protected abstract long acquireInitBatchId(); /** * 从业务库中,检索比批次值更大(比该时间更晚)的视频记录。 * @param nextBatchId * @return */ protected abstract List acquireLoadVideoFromDatabase(long nextBatchId); /** * 从远程服务器拷贝视频文件到本机路径中。 *
     *     1) 视频要拷贝到指定文件根目录,系统有配置: data-folder
     *     2) 拷贝后视频文件必须用数据库ID重命名为文件名,如: 202209123.mp4
     * 
* @param readyLoadList * @param nextBatchId * @return 返回一个最新批次号,也就是当前这批数据的最大时间戳。 */ protected abstract long copyRemoteVideoFiles(List readyLoadList, long nextBatchId) throws Exception; /** * 保存视频批次数据,并创建新状态记录,让 VideoSearchScheduler 能继续完成计算相似度写入。

* 参考: {@linkplain com.iplatform.recvideo.scheduler.VideoSearchScheduler} * @param readyLoadList * @param savedBatchId * @return */ protected abstract int saveDataAndStatus(List readyLoadList, long savedBatchId); }