高级别问题:java(或scala)中是否有一些API调用会让我阻止,等待创建文件而不进行轮询?或者与我可以阻止的文件系统相关的任何?
一些(基本上不相关)细节:我有一个流程,我一次运行几个实例,每个实例都需要完成一部分工作。实例可以在不同的时间开始,并且工作列表可能在过渡期间发生变化,并且使流程明确地相互通信看起来并不可行*。这些进程之间唯一的通信是通过文件系统。所以,我想有一个机制让其中一个进程认识到另一个进程已经启动(但没有完成)当前进程依赖的一项工作,并阻塞,等待另一个进程完成。 / p>
*我真的不想让服务器运行来安排工作;这对我所需要的东西来说太复杂了。无论如何,服务器需要轮询文件系统以进行更新,因为要完成的工作列表在文件系统中,并且可能随时更改......
答案 0 :(得分:4)
由于Java 7有Watchable
(以及包java.nio.file
中的相关类和接口),您可以使用它来监视文件系统事件,使用底层操作系统' s功能而不是直接轮询这些事件。
例如,您可以使用它来获取在文件系统上创建,删除和修改文件的事件。
为了确保第二个进程在第一个进程写入文件之前没有提取文件,您可以让第一个进程首先使用该文件的临时名称,然后在#&#重命名时完成了。然后,可以在重命名文件时通知第二个进程。
以下是一个例子:
Path path = Paths.get("C:\\Temp");
// Watch for files and directories being created in C:\\Temp
// (also triggers when file is renamed)
WatchService watchService = FileSystems.getDefault().newWatchService();
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
// Wait until an event happens
WatchKey key = watchService.take();
// Look at the events that were signaled on the key
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println(event.kind() + " " + event.context());
}
// Stop receiving events
key.cancel();