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());
|
|
public void startup(String videoDataFolder, String batchId, boolean testMode){
|
|
}
|
|
public void destroy(){
|
|
}
|
|
public int execute() throws Exception{
|
|
long nextBatchId = this.acquireNextBatchId();
|
|
if(nextBatchId == 0){
|
logger.debug("未找到下一个(已有)最大批次,说明还没有操作过,默认设置一个合理值做初始查询");
|
nextBatchId = this.acquireInitBatchId();
|
}
|
|
List<VideoLoadInfo> 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<VideoLoadInfo> acquireLoadVideoFromDatabase(long nextBatchId);
|
|
/**
|
* 从远程服务器拷贝视频文件到本机路径中。
|
* <pre>
|
* 1) 视频要拷贝到指定文件根目录,系统有配置: data-folder
|
* 2) 拷贝后视频文件必须用数据库ID重命名为文件名,如: 202209123.mp4
|
* </pre>
|
* @param readyLoadList
|
* @param nextBatchId
|
* @return 返回一个最新批次号,也就是当前这批数据的最大时间戳。
|
*/
|
protected abstract long copyRemoteVideoFiles(List<VideoLoadInfo> readyLoadList, long nextBatchId) throws Exception;
|
|
/**
|
* 保存视频批次数据,并创建新状态记录,让 <code>VideoSearchScheduler</code> 能继续完成计算相似度写入。<p></p>
|
* 参考: {@linkplain com.iplatform.recvideo.scheduler.VideoSearchScheduler}
|
* @param readyLoadList
|
* @param savedBatchId
|
* @return
|
*/
|
protected abstract int saveDataAndStatus(List<VideoLoadInfo> readyLoadList, long savedBatchId);
|
}
|