浏览代码

上报改为异步

donglang 4 月之前
父节点
当前提交
487300e12d

+ 61 - 0
iot-platform-manager/src/main/java/com/platform/api/manager/CustomMockMultipartFile.java

@@ -0,0 +1,61 @@
+package com.platform.api.manager;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+public  class CustomMockMultipartFile implements MultipartFile {
+    private final String name;
+    private final String originalFilename;
+    private final String contentType;
+    private final byte[] bytes;
+
+    public CustomMockMultipartFile(String name, String originalFilename, String contentType, byte[] bytes) {
+        this.name = name;
+        this.originalFilename = originalFilename;
+        this.contentType = contentType;
+        this.bytes = bytes;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return originalFilename;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return bytes == null || bytes.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return bytes.length;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return bytes;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(bytes);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        try (FileOutputStream fos = new FileOutputStream(dest)) {
+            fos.write(bytes);
+        }
+    }
+}

+ 36 - 47
iot-platform-manager/src/main/java/com/platform/api/manager/WeighbridgeRecordManage.java

@@ -20,6 +20,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -93,7 +94,16 @@ public class WeighbridgeRecordManage {
     private void updateImageUrls(WeighbridgePushRequest request, WeighbridgeRecord record) {
         if (request.getImages() != null && request.getImages().length > 0) {
             log.info("开始处理 {} 张图片上传,车牌号: {}", request.getImages().length, request.getLicensePlate());
-            processImageFilesAsync(request.getImages())
+            // 将MultipartFile数组转换为字节数组,防止异步处理时临时文件被清理
+            List<byte[]> imageBytesList = new ArrayList<>();
+            for (MultipartFile image : request.getImages()) {
+                try {
+                    imageBytesList.add(image.getBytes());
+                } catch (IOException e) {
+                    log.error("读取图片文件失败,车牌号: {}", request.getLicensePlate(), e);
+                }
+            }
+            processImageFilesAsync(imageBytesList, request.getLicensePlate())
                     .thenAccept(photoUrls -> {
                         log.info("图片上传完成,车牌号: {},照片数量: {}", request.getLicensePlate(),
                                 photoUrls != null ? photoUrls.split(",").length : 0);
@@ -151,54 +161,33 @@ public class WeighbridgeRecordManage {
      * 为每个图片创建独立的异步任务,实现并行上传
      */
     @Async("taskExecutor")
-    public CompletableFuture<String> processImageFilesAsync(MultipartFile[] images) {
-        log.info("开始并行上传 {} 张图片", images.length);
-        long startTime = System.currentTimeMillis();
-        
-        // 为每个图片创建独立的异步上传任务
-        List<CompletableFuture<String>> uploadTasks = Arrays.stream(images)
-                .map(image -> CompletableFuture.supplyAsync(() -> {
-                    String fileName = image.getOriginalFilename();
-                    log.debug("开始上传图片: {}", fileName);
-                    try {
-                        String ossUrl = FileUtils.uploadFile1(image);
-                        if (StringUtils.isNotBlank(ossUrl)) {
-                            log.debug("图片上传成功: {} -> {}", fileName, ossUrl);
-                            return ossUrl;
-                        } else {
-                            log.warn("图片上传返回空URL: {}", fileName);
-                            return null;
-                        }
-                    } catch (Exception e) {
-                        log.error("上传图片失败: {}", fileName, e);
-                        // 不抛出异常,返回 null,让其他图片继续上传
-                        return null;
-                    }
-                }, taskExecutor))  // 使用线程池执行
-                .collect(Collectors.toList());
-
-        // 等待所有上传任务完成
-        CompletableFuture<Void> allOf = CompletableFuture.allOf(
-                uploadTasks.toArray(new CompletableFuture[0])
-        );
+    public CompletableFuture<String> processImageFilesAsync(List<byte[]> imageBytesList, String licensePlate) {
+        List<String> resultList = new ArrayList<>();
+        for (byte[] imageBytes : imageBytesList) {
+            String ossUrl = null;
+            try {
+                // 将字节数组包装成MultipartFile进行上传
+                String filename = "image" + System.currentTimeMillis() + ".jpg";
+                MultipartFile multipartFile = new CustomMockMultipartFile(
+                        filename,
+                        filename,
+                        "image/jpeg",
+                        imageBytes
+                );
+                ossUrl = FileUtils.uploadFile(multipartFile);
+            } catch (Exception e) {
+                log.error("上传文件异常,车牌号: {}", licensePlate, e);
+                throw new IotException(ErrorCodeEnum.SYSTEM_ERROR, "上传文件异常");
+            }
+            if (StringUtils.isNotBlank(ossUrl)) {
+                resultList.add(ossUrl);
+            }
+        }
+        return CompletableFuture.completedFuture(String.join(",", resultList));
+    }
 
-        // 收集所有成功上传的 URL
-        return allOf.thenApply(v -> {
-            List<String> successUrls = uploadTasks.stream()
-                    .map(CompletableFuture::join)  // 获取每个任务的结果
-                    .filter(StringUtils::isNotBlank)  // 过滤掉失败的(null)
-                    .collect(Collectors.toList());
 
-            long endTime = System.currentTimeMillis();
-            log.info("图片并行上传完成 - 总数: {}, 成功: {}, 失败: {}, 耗时: {}ms", 
-                    images.length, 
-                    successUrls.size(), 
-                    images.length - successUrls.size(),
-                    endTime - startTime);
 
-            return String.join(",", successUrls);
-        });
-    }
     /**
      * 异步更新图片URL
      */
@@ -263,7 +252,7 @@ public class WeighbridgeRecordManage {
             log.info("车牌验证失败");
             response.setStatus(Boolean.FALSE);
             response.setCode(400);
-            response.setMessage("车牌验证异常,请重新识别或联系管理员");
+            response.setMessage("车牌验证异常");
 
             response.setData(new LicensePlateValidateResponse.Data());
             response.getData().setTimestamp(System.currentTimeMillis());