shikeying
2022-09-30 a78b76b664830a1ac691396d5cb64166c6919ff1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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<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);
}