package com.chinaztt.mes.quality.excel;
|
|
import com.alibaba.excel.context.AnalysisContext;
|
import com.alibaba.excel.event.AnalysisEventListener;
|
import com.alibaba.fastjson.JSON;
|
import com.chinaztt.mes.quality.service.TestStandardService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
|
import java.util.ArrayList;
|
import java.util.LinkedList;
|
import java.util.List;
|
|
/**
|
* @Auther: shihongzhi
|
* @Date: 2021/12/22/17:52
|
* @Description:
|
*/
|
@Slf4j
|
public class TestStandardUploadListener extends AnalysisEventListener<TestStandardData> {
|
|
/**
|
* 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
|
*/
|
private static final int BATCH_COUNT = 10000;
|
|
/**
|
* 缓存的数据
|
*/
|
private List<TestStandardData> cachedDataList = new LinkedList<>();
|
|
private TestStandardService testStandardService;
|
|
public TestStandardUploadListener(TestStandardService testStandardService) {
|
this.testStandardService = testStandardService;
|
}
|
|
@Override
|
public void invoke(TestStandardData testStandardData, AnalysisContext analysisContext) {
|
log.info("解析到一条数据:{}", JSON.toJSONString(testStandardData));
|
cachedDataList.add(testStandardData);
|
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
|
if (cachedDataList.size() >= BATCH_COUNT) {
|
saveData();
|
// 存储完成清理 list
|
cachedDataList.clear();
|
}
|
}
|
|
@Override
|
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
|
saveData();
|
log.info("所有数据解析完成!");
|
}
|
|
/**
|
* 加上存储数据库
|
*/
|
private void saveData() {
|
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
|
testStandardService.importExcel(cachedDataList);
|
log.info("存储数据库成功!");
|
}
|
}
|