From 0c146ef03aa7ca7084a75603803907a88cf0d854 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期六, 20 十二月 2025 08:41:11 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/task/DeviceLogScheduler.java |   72 ++++++++++++++++++++++++++++--------
 src/main/resources/application.yml                     |    2 
 2 files changed, 57 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/zy/core/task/DeviceLogScheduler.java b/src/main/java/com/zy/core/task/DeviceLogScheduler.java
index 0f0d4f7..8f5ff54 100644
--- a/src/main/java/com/zy/core/task/DeviceLogScheduler.java
+++ b/src/main/java/com/zy/core/task/DeviceLogScheduler.java
@@ -14,10 +14,13 @@
 import org.springframework.stereotype.Component;
 
 import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
 import java.text.SimpleDateFormat;
 import java.util.Comparator;
 import java.util.Date;
@@ -26,6 +29,8 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Stream;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -43,12 +48,21 @@
     @Autowired
     private RedisUtil redisUtil;
 
+    private static final ReentrantLock FILE_OP_LOCK = new ReentrantLock();
+
     @Scheduled(cron = "0/3 * * * * ? ")
     public void delDeviceLog() {
         if ("mysql".equals(storageType)) {
             deviceDataLogService.clearLog(expireDays == null ? 1 : expireDays);
         }else if ("file".equals(storageType)) {
-            clearFileLog(expireDays == null ? 1 : expireDays);
+            if (!FILE_OP_LOCK.tryLock()) {
+                return;
+            }
+            try {
+                clearFileLog(expireDays == null ? 1 : expireDays);
+            } finally {
+                FILE_OP_LOCK.unlock();
+            }
         }else {
             log.error("鏈畾涔夌殑瀛樺偍绫诲瀷锛歿}", storageType);
         }
@@ -72,7 +86,14 @@
             if ("mysql".equals(storageType)) {
                 mysqlSave(keys, list);
             }else if ("file".equals(storageType)) {
-                fileSave(keys, list);
+                if (!FILE_OP_LOCK.tryLock()) {
+                    return;
+                }
+                try {
+                    fileSave(keys, list);
+                } finally {
+                    FILE_OP_LOCK.unlock();
+                }
             }else {
                 log.error("鏈畾涔夌殑瀛樺偍绫诲瀷锛歿}", storageType);
             }
@@ -119,7 +140,9 @@
                         if (size + line.length > max) {
                             index++;
                             current = dayDir.resolve(prefix + index + ".log");
-                            Files.createFile(current);
+                            if (!Files.exists(current)) {
+                                Files.createFile(current);
+                            }
                             size = 0;
                         }
                         Files.write(current, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
@@ -134,12 +157,15 @@
     }
 
     private int findStartIndex(Path baseDir, String prefix) throws Exception {
-        List<Path> matched = Files.list(baseDir)
-                .filter(p -> {
-                    String n = p.getFileName().toString();
-                    return n.startsWith(prefix) && n.endsWith(".log");
-                })
-                .collect(Collectors.toList());
+        List<Path> matched;
+        try (Stream<Path> stream = Files.list(baseDir)) {
+            matched = stream
+                    .filter(p -> {
+                        String n = p.getFileName().toString();
+                        return n.startsWith(prefix) && n.endsWith(".log");
+                    })
+                    .collect(Collectors.toList());
+        }
         int maxIdx = 0;
         for (Path p : matched) {
             String name = p.getFileName().toString();
@@ -172,18 +198,32 @@
             }
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
             long cutoff = System.currentTimeMillis() - (long) days * 24 * 60 * 60 * 1000;
-            List<Path> dirs = Files.list(baseDir).filter(Files::isDirectory).collect(Collectors.toList());
+            List<Path> dirs;
+            try (Stream<Path> stream = Files.list(baseDir)) {
+                dirs = stream.filter(Files::isDirectory).collect(Collectors.toList());
+            }
             for (Path dir : dirs) {
                 String name = dir.getFileName().toString();
                 if (name.length() == 8 && name.chars().allMatch(Character::isDigit)) {
                     Date d = sdf.parse(name);
                     if (d.getTime() < cutoff) {
-                        List<Path> all = Files.walk(dir).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
-                        for (Path p : all) {
-                            try {
-                                Files.deleteIfExists(p);
-                            } catch (Exception ignored) {}
-                        }
+                        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
+                            @Override
+                            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+                                try {
+                                    Files.deleteIfExists(file);
+                                } catch (Exception ignored) {}
+                                return FileVisitResult.CONTINUE;
+                            }
+
+                            @Override
+                            public FileVisitResult postVisitDirectory(Path dir, java.io.IOException exc) {
+                                try {
+                                    Files.deleteIfExists(dir);
+                                } catch (Exception ignored) {}
+                                return FileVisitResult.CONTINUE;
+                            }
+                        });
                     }
                 }
             }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ccab441..7f8fe23 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -71,7 +71,7 @@
 
 deviceLogStorage:
   # 璁惧鏃ュ織瀛樺偍鏂瑰紡 mysql file
-  type: mysql
+  type: file
   # file绫诲瀷瀛樺偍鍦板潃
   loggingPath: /stock/out/@pom.build.finalName@/deviceLogs
   # 鏃ュ織杩囨湡鏃堕棿 鍗曚綅澶�

--
Gitblit v1.9.1