From f35a467ebcad788563f9e10f778d986bdaa3f13b Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Wed, 31 Dec 2025 23:15:27 +0800 Subject: [PATCH] fix(LocalRunnerClient): support registering subdirectories in LocalWatchServiceBuild --- .../core/action/runner/LocalRunnerClient.java | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java index 20caec3b..620f84b8 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java @@ -308,6 +308,9 @@ public class LocalRunnerClient extends RunnerClient { private final Map, EventHandler> handlers = new HashMap<>(); private InitLoader initLoader; + private final WatchContext ctx; + List> kinds = new ArrayList<>(); + private boolean watchAll = false; private BuildRegistry(WatchContext ctx) { this.ctx = ctx; @@ -315,24 +318,28 @@ public class LocalRunnerClient extends RunnerClient { @Override public LocalWatchServiceBuild registerCreate(EventHandler handler) { + kinds.add(StandardWatchEventKinds.ENTRY_CREATE); handlers.put(StandardWatchEventKinds.ENTRY_CREATE, handler); return this; } @Override public LocalWatchServiceBuild registerModify(EventHandler handler) { + kinds.add(StandardWatchEventKinds.ENTRY_MODIFY); handlers.put(StandardWatchEventKinds.ENTRY_MODIFY, handler); return this; } @Override public LocalWatchServiceBuild registerDelete(EventHandler handler) { + kinds.add(StandardWatchEventKinds.ENTRY_DELETE); handlers.put(StandardWatchEventKinds.ENTRY_DELETE, handler); return this; } @Override public LocalWatchServiceBuild registerOverflow(EventHandler handler) { + kinds.add(StandardWatchEventKinds.OVERFLOW); handlers.put(StandardWatchEventKinds.OVERFLOW, handler); return this; } @@ -344,11 +351,41 @@ public class LocalRunnerClient extends RunnerClient { } @Override - public void commit() { - if (initLoader != null) initLoader.load(path); + public LocalWatchServiceBuild watchAll(boolean watchAll) { + this.watchAll = watchAll; + return this; + } + + @Override + public void commit(ExecutorService executor) { + registerPath(); + if (initLoader != null) + initLoader.load(); executor.execute(buildWatchTask()); } + private void registerPath() { + Path path = ctx.path; + WatchService watchService = ctx.watchService; + Map watchKeys = ctx.watchKeys; + try { + WatchEvent.Kind[] kindsArray = kinds.toArray(WatchEvent.Kind[]::new); + WatchKey root = path.register(watchService, kindsArray); + watchKeys.put(root, path); + if (!watchAll) { + return; + } + Stream walk = Files.walk(path).filter(Files::isDirectory); + for (Path dir : walk.toList()) { + WatchKey key = dir.register(watchService, kindsArray); + watchKeys.put(key, dir); + } + walk.close(); + } catch (IOException e) { + log.error("监听目录注册失败: "); + } + } + private Runnable buildWatchTask() { return () -> { String pathStr = ctx.path.toString(); @@ -363,10 +400,6 @@ public class LocalRunnerClient extends RunnerClient { Object context = e.context(); log.info("行动程序目录变更事件: {} - {} - {}", pathStr, kind.name(), context); Path thisDir = (Path) key.watchable(); - if (!thisDir.equals(path)) { - // 若事件所在目录不为为 path,忽略并步入下一轮循环 - continue; - } EventHandler handler = handlers.get(kind); if (handler == null) { continue;