1.需求
对于成千上万数据量的excel导入,后台处理耗时长,体验差.需要实时展示当前导入的进度,提高使用体验
2.实现思路
采用多线程进行实现
在导入开始执行前,生成一个uuid和进度对象,储存到静态Map中
使用一个新线程执行导入,导入执行时,将导入的进度信息放到uuid对应的对象里
将uuid返回给前端.请求结束
-前端循环发请求,从后台获取uuid对应的进度对象,将展示到页面上
3.页面实现效果(仅供参考)
正在导入
导入完成
4.定义用于存储导入进度的对象
将进度的一些常用信息进行定义,同时声明一个静态Map,用于存储所有进度信息
/**
* 用于存储学生信息导入的进度信息
* @author authstr
* @time 2019年10月24日16:56:21
*/
public class ImportAsynInfo {
//用于存储所有的导入进度信息
public static Map allAsynInfo=new HashMap();
//提示信息或 异常信息
private String msg;
//数据总数
private Integer totality=0;
//已处理的数据条数
private Integer doneSum=0;
//失败的数据条数
private Integer errorSum=0;
//成功的数据条数
private Integer successSum=0;
//错误文件的路径
public String errorFilePath;
//导入是否结束
public Boolean isEnd= false;
/**
* 创建一个进度信息,并获取对应的uuid
* @return
*/
public static String createAsynInfo(){
ImportAsynInfo asynInfo=new ImportAsynInfo();
String uuid=UUID.randomUUID().toString().replace("-","");
allAsynInfo.put(uuid,asynInfo);
return uuid;
}
/**
* 通过uuid获取进度信息
* @param uuid
* @return
*/
public static ImportAsynInfo getAsynInfo(String uuid){
return allAsynInfo.get(uuid);
}
/**
* 通过uuid删除对应的进度信息
* @param uuid
* @return
*/
public static void deleteAsynInfo(String uuid){
allAsynInfo.remove(uuid);
}
/**
* uuid对应的进度 已处理的数据条数+1
* @param uuid
*/
public static void doneSumAddOne(String uuid){
ImportAsynInfo asynInfo= getAsynInfo(uuid);
asynInfo.setDoneSum(asynInfo.getDoneSum()+1);
}
/**
* uuid对应的进度 失败的数据条数+1
* @param uuid
*/
public static void errorSumAddOne(String uuid){
ImportAsynInfo asynInfo= getAsynInfo(uuid);
asynInfo.setErrorSum(asynInfo.getErrorSum()+1);
}
/**
* uuid对应的进度 成功的数据条数+1
* @param uuid
*/
public static void successSumAddOne(String uuid){
ImportAsynInfo asynInfo= getAsynInfo(uuid);
asynInfo.setSuccessSum(asynInfo.getSuccessSum()+1);
}
public String getMsg() {
return msg;