Просмотр исходного кода

[上传导入异常][修改]:redis异常处理

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
fd336b2f51
2 измененных файлов: 94 добавлений и 26 удалений
  1. +22
    -16
      mallinkAdmin/src/main/java/com/iformall/controller/AsyncTask.java
  2. +72
    -10
      mallinkAdmin/src/main/java/com/iformall/controller/WxCUserBasicInfoController.java

+ 22
- 16
mallinkAdmin/src/main/java/com/iformall/controller/AsyncTask.java Просмотреть файл

@@ -19,9 +19,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;


import java.io.File;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;


@Component @Component
public class AsyncTask { public class AsyncTask {
@@ -48,8 +49,18 @@ public class AsyncTask {


} }


private void set_redis_value(String importKey, String allCount, String allSuccessCount, String processCount, String failCount, boolean fail) {
stringRedisTemplate.opsForHash().put(importKey, "allCount", allCount);
stringRedisTemplate.opsForHash().put(importKey, "allSuccessCount", allSuccessCount);
stringRedisTemplate.opsForHash().put(importKey, "processCount", processCount);
stringRedisTemplate.opsForHash().put(importKey, "failCount", failCount);
if(fail) {
stringRedisTemplate.expire(importKey,10, TimeUnit.SECONDS);
}
}

@Async @Async
public void importExcelData(MultipartFile file, MallUserInfo user, String importKey, String tenantId) {
public void importExcelData(File file, MallUserInfo user, String importKey, String tenantId) {
ImportParams params = new ImportParams(); ImportParams params = new ImportParams();
// 需要验证 // 需要验证
params.setImportFields(new String[]{"姓名", "性别", "手机号", "微信昵称", "学历", "生日", "地址", "上次活跃时间", "注册时间", "标签", "成长值"}); params.setImportFields(new String[]{"姓名", "性别", "手机号", "微信昵称", "学历", "生日", "地址", "上次活跃时间", "注册时间", "标签", "成长值"});
@@ -60,22 +71,20 @@ public class AsyncTask {
ExcelImportResult<CUserBaseInfoT> datalist = null; ExcelImportResult<CUserBaseInfoT> datalist = null;


try { try {
datalist = ExcelImportUtil.importExcelMore(file.getInputStream(), CUserBaseInfoT.class, params);
datalist = ExcelImportUtil.importExcelMore(file, CUserBaseInfoT.class, params);
} catch (Exception e) { } catch (Exception e) {
stringRedisTemplate.opsForHash().put(importKey, "allCount", "1");
stringRedisTemplate.opsForHash().put(importKey, "allSuccessCount", "0");
stringRedisTemplate.opsForHash().put(importKey, "processCount", "0");
stringRedisTemplate.opsForHash().put(importKey, "failCount", "1");
set_redis_value(importKey, "1", "0", "0", "1", true);
logger.error(e.getMessage()); logger.error(e.getMessage());
// 删除缓存文件
file.delete();
return; return;
} }
// 删除缓存文件
file.delete();


if(datalist == null) { if(datalist == null) {
logger.error("导入模板失败: 模板数据解析失败"); logger.error("导入模板失败: 模板数据解析失败");
stringRedisTemplate.opsForHash().put(importKey, "allCount", "1");
stringRedisTemplate.opsForHash().put(importKey, "allSuccessCount", "0");
stringRedisTemplate.opsForHash().put(importKey, "processCount", "0");
stringRedisTemplate.opsForHash().put(importKey, "failCount", "1");
set_redis_value(importKey, "1", "0", "0", "1", true);
return; return;
} }


@@ -87,10 +96,7 @@ public class AsyncTask {
int all_fail = failList.size(); int all_fail = failList.size();


//添加到redis里 //添加到redis里
stringRedisTemplate.opsForHash().put(importKey, "allCount", "" + total);
stringRedisTemplate.opsForHash().put(importKey, "allSuccessCount", "" + all_success);
stringRedisTemplate.opsForHash().put(importKey, "processCount", "0");
stringRedisTemplate.opsForHash().put(importKey, "failCount", "" + all_fail);
set_redis_value(importKey, "" + total, "" + all_success, "0", "" + all_fail, false);


logger.info("验证通过的数量: " + successList.size()); logger.info("验证通过的数量: " + successList.size());
logger.info("验证未通过的数量: " + failList.size()); logger.info("验证未通过的数量: " + failList.size());
@@ -109,7 +115,7 @@ public class AsyncTask {
wxCUserBasicInfoService.importOneMem(tenantId, importKey, tagList, uBase); wxCUserBasicInfoService.importOneMem(tenantId, importKey, tagList, uBase);
}); });
} catch (Exception e) { } catch (Exception e) {
stringRedisTemplate.opsForHash().put(importKey, "allCount", "" + all_fail);
set_redis_value(importKey, "1", "0", "0", "1", true);
e.printStackTrace(); e.printStackTrace();
logger.error("导入模板失败:"+e.getMessage()); logger.error("导入模板失败:"+e.getMessage());
} }


+ 72
- 10
mallinkAdmin/src/main/java/com/iformall/controller/WxCUserBasicInfoController.java Просмотреть файл

@@ -25,10 +25,13 @@ import org.springframework.web.multipart.MultipartFile;


import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;


@@ -258,12 +261,20 @@ public class WxCUserBasicInfoController extends BaseController {


} }


private void set_redis_value(String importKey, String allCount, String allSuccessCount, String processCount, String failCount, boolean fail) {
stringRedisTemplate.opsForHash().put(importKey, "allCount", allCount);
stringRedisTemplate.opsForHash().put(importKey, "allSuccessCount", allSuccessCount);
stringRedisTemplate.opsForHash().put(importKey, "processCount", processCount);
stringRedisTemplate.opsForHash().put(importKey, "failCount", failCount);
if(fail) {
stringRedisTemplate.expire(importKey,10, TimeUnit.SECONDS);
}
}



@RequestMapping("/importTemplate")
public ResultData importTemplate(@RequestParam("file") MultipartFile file) {
@PostMapping(value = "/importTemplate", consumes = "multipart/*")
public ResultData importTemplate(@RequestParam("file") MultipartFile mFile) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicInfoController::importTemplate"); logger.debug("[" + getIpAddr() + "] WxCUserBasicInfoController::importTemplate");
if (file.isEmpty()) {
if (mFile.isEmpty()) {
throw new MallinkException(Result.ERROR, "上传文件不能为空"); throw new MallinkException(Result.ERROR, "上传文件不能为空");
} }
//得到当前用户ID //得到当前用户ID
@@ -279,20 +290,71 @@ public class WxCUserBasicInfoController extends BaseController {
} }


stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allCount", 0 + ""); stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allCount", 0 + "");
stringRedisTemplate.expire(importKey,30,TimeUnit.MINUTES);
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allSuccessCount", 0 + ""); stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allSuccessCount", 0 + "");
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "processCount", ""); stringRedisTemplate.opsForHash().putIfAbsent(importKey, "processCount", "");
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "failCount", ""); stringRedisTemplate.opsForHash().putIfAbsent(importKey, "failCount", "");


asyncTask.importExcelData(file, user, importKey, tenantId);
String fpath = "./upload/";
File targetFile = new File(fpath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
String fileName = "1.xls";
int dot = mFile.getOriginalFilename().lastIndexOf('.');
fileName = fileName + mFile.getOriginalFilename().substring(dot, mFile.getOriginalFilename().length());

File lFile = new File(fpath + File.separator + fileName);

FileOutputStream fos = null;
BufferedInputStream fs = null;
try {
fos = new FileOutputStream(lFile);
fs = (BufferedInputStream) mFile.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fs.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
fs.close();
} catch (Exception e) {
stringRedisTemplate.expire(importKey,3,TimeUnit.SECONDS);
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allCount", "1");
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "failCount", "1");
logger.error(e.getMessage());
return new ResultData(ErrorCode.MEM_IMPORT_ERR.getCode(), "模板上传失败");
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
stringRedisTemplate.expire(importKey,3,TimeUnit.SECONDS);
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allCount", "1");
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "failCount", "1");
logger.error(e.getMessage());
return new ResultData(ErrorCode.MEM_IMPORT_ERR.getCode(), "模板上传失败");
}
}
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
stringRedisTemplate.expire(importKey,3,TimeUnit.SECONDS);
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "allCount", "1");
stringRedisTemplate.opsForHash().putIfAbsent(importKey, "failCount", "1");
logger.error(e.getMessage());
return new ResultData(ErrorCode.MEM_IMPORT_ERR.getCode(), "模板上传失败");
}
}
}

asyncTask.importExcelData(lFile, user, importKey, tenantId);


stringRedisTemplate.expire(importKey,30,TimeUnit.MINUTES);
return new ResultData(Result.SUCCESS, "模板正在导入"); return new ResultData(Result.SUCCESS, "模板正在导入");
} }







@GetMapping("/queryTemplateCount") @GetMapping("/queryTemplateCount")
public ResultData queryTemplateCount() { public ResultData queryTemplateCount() {
String importKey = importMemPrev + getUser().getId(); String importKey = importMemPrev + getUser().getId();


Загрузка…
Отмена
Сохранить