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