WatchService большое количество каталогов (рекурсивно)
Я хочу обнаруживать изменения внутри каталога, поэтому реализую их с помощью WatchService.
public class DirWatcher implements Runnable {
private Path path;
private ExecutorService exe;
public DirWatcher(Path path, ExecutorService exe) {
this.path = path;
this.exe = exe;
}
public void start() throws Exception {
WatchService watchService = FileSystems.getDefault().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
if(isFileEvent(event)) {
// do stuff with file
} else if(isNewDirCreated(event)) {
Path dir = getPath(event, path);
DirWatcher newWatcher = new DirWatcher(dir, exe);
exe.execute(newWatcher);
}
}
key.reset();
}
watchService.close();
}
public void run() {
try {
start();
} catch(Exception e) {
}
}
//Other methods
}
Вот основной метод
public class DirectoryWatcherExample {
public static void main(String[] args) throws Exception {
Path root = getRootPath();
ExecutorService exe = Executors.newFixedThreadPool(//HOW BIG THE POOL SHOULD I INIT? THE NUMBER OF DIRECTORIES IS LARGE (> 50000))
DirWatcher watcher = new DirWatcher(root, exe);
exe.execute(watcher);
List<Path> paths = listRecrursive(root);
paths.stream().map(p -> new DirWatcher(p, exe)).forEach(exe::execute);
}
}
Мой вопрос: как мне инициализировать пул потоков? Так как количество задач огромно (> 50000). Влияет ли это на сервер (64 ГБ ОЗУ)?
Полезны ли в этом случае ForkJoinPool и RecursiveTask? Если да, не могли бы вы предоставить псевдокод? Если нет, есть ли оптимизированное решение? Спасибо