Browse Source

修改:

1.居民导入-改为异步-待测试
master
wangxianzhang 4 years ago
parent
commit
d59d188754
  1. 104
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java
  2. 2
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java
  3. 14
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

104
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

@ -53,7 +53,6 @@ import com.epmet.dto.form.*;
import com.epmet.dto.result.*; import com.epmet.dto.result.*;
import com.epmet.enums.IcResiUserTableEnum; import com.epmet.enums.IcResiUserTableEnum;
import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.excel.support.ExportResiUserItemDTO;
import com.epmet.feign.EpmetCommonServiceOpenFeignClient;
import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient;
import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient;
import com.epmet.feign.OssFeignClient; import com.epmet.feign.OssFeignClient;
@ -65,6 +64,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.MimeHeaders;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
@ -72,17 +72,21 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -429,30 +433,95 @@ public class IcResiUserController implements ResultDataResolver {
*/ */
@NoRepeatSubmit @NoRepeatSubmit
@PostMapping("importExcel") @PostMapping("importExcel")
public void importExcelByEasyExcel(@RequestHeader("customerId") String customerId,@RequestPart("file") MultipartFile file, HttpServletResponse response) { public Result importExcelByEasyExcel(@RequestHeader("customerId") String customerId,@RequestPart("file") MultipartFile file, HttpServletRequest multipartRequest, HttpServletResponse response) {
if (file.isEmpty()) { if (file.isEmpty()) {
throw new RenException("请上传文件"); throw new RenException("请上传文件");
} }
String originalFilename = file.getOriginalFilename();
// 校验文件类型 // 校验文件类型
String extension = FilenameUtils.getExtension(file.getOriginalFilename()); String extension = FilenameUtils.getExtension(originalFilename);
if (!"xls".equals(extension) && !"xlsx".equals(extension)) { if (!"xls".equals(extension) && !"xlsx".equals(extension)) {
throw new RenException("文件类型不匹配"); throw new RenException("文件类型不匹配");
} }
String operatorId = loginUserUtil.getLoginUserId(); String operatorId = loginUserUtil.getLoginUserId();
String importTaskId;
// 记录导入任务 String importTaskId = icResiUserImportService.createImportTaskRecord(operatorId, ImportTaskConstants.BIZ_TYPE_RESI, originalFilename);;
importTaskId = icResiUserImportService.createImportTaskRecord(operatorId, ImportTaskConstants.BIZ_TYPE_RESI);
// 转储文件到临时目录 && 执行异步导入 // 缓存上传的文件
submitResiImportTask(customerId, operatorId, importTaskId, extension, file, response); Path importTempFileSavePath;
// ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); try {
// CompletableFuture.runAsync(() -> { String fileName = UUID.randomUUID().toString().concat(".").concat(extension);
// RequestContextHolder.setRequestAttributes(sra, true); importTempFileSavePath = IC_RESI_UPLOAD_DIR.resolve(fileName);
// submitResiImportTask(customerId, operatorId, importTaskId, extension, file, response); IOUtils.copy(file.getInputStream(), new FileOutputStream(importTempFileSavePath.toString()));
// }); } catch (Exception e) {
log.error("【上传居民信息】保存上传的文件失败:{}", ExceptionUtils.getErrorStackTrace(e));
throw new RenException("上传失败");
}
final Path importTempFileSavePathFinal = importTempFileSavePath;
HttpServletRequest request = ((StandardMultipartHttpServletRequest)multipartRequest).getRequest();
HashMap<String, String> headers = getHeadersFromRequest(request);
// 异步执行导入
CompletableFuture.runAsync(() -> {
try {
// 睡眠2秒钟,等待主线程先结束,主线程会清空request对象的headers,等他执行了清空之后,我们这边再手动setHeader进去
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
setHeaders2Request(request, headers);
submitResiImportTask(customerId, operatorId, importTaskId, importTempFileSavePathFinal, response);
});
return new Result();
}
private HashMap<String, String> getHeadersFromRequest(HttpServletRequest request) {
HashMap<String, String> headers = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
Enumeration<String> values = request.getHeaders(name);
while (values.hasMoreElements()) {
String value = values.nextElement();
headers.put(name, value);
}
}
}
return headers;
}
private void setHeaders2Request(HttpServletRequest request, HashMap<String, String> headers) {
for (Map.Entry<String, String> kv : headers.entrySet()) {
setParam2Header(request, kv.getKey(), kv.getValue());
}
}
private void setParam2Header(HttpServletRequest requestFacade, String key, String value){
Class<? extends HttpServletRequest> requestFacadeClass = requestFacade.getClass();
try {
Field requestField = requestFacadeClass.getDeclaredField("request");
requestField.setAccessible(true);
Object requestObject = requestField.get(requestFacade);
Field coyoteRequestField = requestObject.getClass().getDeclaredField("coyoteRequest");
coyoteRequestField.setAccessible(true);
Object coyoteRequestObject = coyoteRequestField.get(requestObject);
Field headers = coyoteRequestObject.getClass().getDeclaredField("headers");
headers.setAccessible(true);
MimeHeaders o2 = (MimeHeaders)headers.get(coyoteRequestObject);
o2.addValue(key).setString(value);
} catch (Exception e) {
e.printStackTrace();
log.error("为子线程设置请求头出错");
}
} }
/** /**
@ -460,18 +529,11 @@ public class IcResiUserController implements ResultDataResolver {
* @param customerId * @param customerId
* @param operatorId * @param operatorId
* @param importTaskId * @param importTaskId
* @param extension
* @param file
* @param response * @param response
*/ */
private void submitResiImportTask(String customerId, String operatorId, String importTaskId, String extension, MultipartFile file, HttpServletResponse response) { private void submitResiImportTask(String customerId, String operatorId, String importTaskId, Path importTempFileSavePath, HttpServletResponse response) {
Path importTempFileSavePath = null;
try { try {
String fileName = UUID.randomUUID().toString().concat(".").concat(extension);
importTempFileSavePath = IC_RESI_UPLOAD_DIR.resolve(fileName);
IOUtils.copy(file.getInputStream(), new FileOutputStream(importTempFileSavePath.toString()));
List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode()); List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode());
icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, importTempFileSavePath.toString(), response, IC_RESI_UPLOAD_DIR); icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, importTempFileSavePath.toString(), response, IC_RESI_UPLOAD_DIR);
} catch (Throwable e) { } catch (Throwable e) {

2
epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java

@ -21,7 +21,7 @@ public interface IcResiUserImportService {
* @param bizType * @param bizType
* @return * @return
*/ */
String createImportTaskRecord(String operatorId, String bizType); String createImportTaskRecord(String operatorId, String bizType, String originFileName);
/** /**
* 完成导入任务 * 完成导入任务

14
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

@ -1805,17 +1805,17 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param bizType * @param bizType
* @return * @return
*/ */
public String createImportTaskRecord(String operatorId, String bizType) { public String createImportTaskRecord(String operatorId, String bizType, String originFilename) {
ImportTaskCommonFormDTO importTaskForm = new ImportTaskCommonFormDTO(); ImportTaskCommonFormDTO importTaskForm = new ImportTaskCommonFormDTO();
importTaskForm.setOperatorId(operatorId); importTaskForm.setOperatorId(operatorId);
importTaskForm.setBizType(bizType); importTaskForm.setBizType(bizType);
ImportTaskCommonResultDTO resultDTO = getResultDataOrThrowsException(commonServiceOpenFeignClient.createImportTask(importTaskForm), importTaskForm.setOriginFileName(originFilename);
ServiceConstant.EPMET_COMMON_SERVICE, Result<ImportTaskCommonResultDTO> result = commonServiceOpenFeignClient.createImportTask(importTaskForm);
EpmetErrorCode.SERVER_ERROR.getCode(), if (result != null && !result.success()) {
"【居民信息导入】创建导入任务记录失败", throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), result.getMsg(), result.getMsg());
"【居民信息导入】创建导入任务记录失败"); }
return resultDTO.getTaskId(); return result.getData().getTaskId();
} }
/** /**

Loading…
Cancel
Save