fix(LocalRunnerClient): support registering subdirectories in LocalWatchServiceBuild

This commit is contained in:
2025-12-31 23:15:27 +08:00
parent 64b907707a
commit f35a467ebc

View File

@@ -308,6 +308,9 @@ public class LocalRunnerClient extends RunnerClient {
private final Map<WatchEvent.Kind<?>, EventHandler> handlers = new HashMap<>(); private final Map<WatchEvent.Kind<?>, EventHandler> handlers = new HashMap<>();
private InitLoader initLoader; private InitLoader initLoader;
private final WatchContext ctx;
List<WatchEvent.Kind<?>> kinds = new ArrayList<>();
private boolean watchAll = false;
private BuildRegistry(WatchContext ctx) { private BuildRegistry(WatchContext ctx) {
this.ctx = ctx; this.ctx = ctx;
@@ -315,24 +318,28 @@ public class LocalRunnerClient extends RunnerClient {
@Override @Override
public LocalWatchServiceBuild registerCreate(EventHandler handler) { public LocalWatchServiceBuild registerCreate(EventHandler handler) {
kinds.add(StandardWatchEventKinds.ENTRY_CREATE);
handlers.put(StandardWatchEventKinds.ENTRY_CREATE, handler); handlers.put(StandardWatchEventKinds.ENTRY_CREATE, handler);
return this; return this;
} }
@Override @Override
public LocalWatchServiceBuild registerModify(EventHandler handler) { public LocalWatchServiceBuild registerModify(EventHandler handler) {
kinds.add(StandardWatchEventKinds.ENTRY_MODIFY);
handlers.put(StandardWatchEventKinds.ENTRY_MODIFY, handler); handlers.put(StandardWatchEventKinds.ENTRY_MODIFY, handler);
return this; return this;
} }
@Override @Override
public LocalWatchServiceBuild registerDelete(EventHandler handler) { public LocalWatchServiceBuild registerDelete(EventHandler handler) {
kinds.add(StandardWatchEventKinds.ENTRY_DELETE);
handlers.put(StandardWatchEventKinds.ENTRY_DELETE, handler); handlers.put(StandardWatchEventKinds.ENTRY_DELETE, handler);
return this; return this;
} }
@Override @Override
public LocalWatchServiceBuild registerOverflow(EventHandler handler) { public LocalWatchServiceBuild registerOverflow(EventHandler handler) {
kinds.add(StandardWatchEventKinds.OVERFLOW);
handlers.put(StandardWatchEventKinds.OVERFLOW, handler); handlers.put(StandardWatchEventKinds.OVERFLOW, handler);
return this; return this;
} }
@@ -344,11 +351,41 @@ public class LocalRunnerClient extends RunnerClient {
} }
@Override @Override
public void commit() { public LocalWatchServiceBuild watchAll(boolean watchAll) {
if (initLoader != null) initLoader.load(path); this.watchAll = watchAll;
return this;
}
@Override
public void commit(ExecutorService executor) {
registerPath();
if (initLoader != null)
initLoader.load();
executor.execute(buildWatchTask()); executor.execute(buildWatchTask());
} }
private void registerPath() {
Path path = ctx.path;
WatchService watchService = ctx.watchService;
Map<WatchKey, Path> 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<Path> 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() { private Runnable buildWatchTask() {
return () -> { return () -> {
String pathStr = ctx.path.toString(); String pathStr = ctx.path.toString();
@@ -363,10 +400,6 @@ public class LocalRunnerClient extends RunnerClient {
Object context = e.context(); Object context = e.context();
log.info("行动程序目录变更事件: {} - {} - {}", pathStr, kind.name(), context); log.info("行动程序目录变更事件: {} - {} - {}", pathStr, kind.name(), context);
Path thisDir = (Path) key.watchable(); Path thisDir = (Path) key.watchable();
if (!thisDir.equals(path)) {
// 若事件所在目录不为为 path忽略并步入下一轮循环
continue;
}
EventHandler handler = handlers.get(kind); EventHandler handler = handlers.get(kind);
if (handler == null) { if (handler == null) {
continue; continue;