documentation for the overflow州:
OVERFLOW - 表示事件可能已丢失或丢弃。
它没有说在什么情况下我应该期望事件丢失或丢弃?起初我以为这是将很多文件写入文件夹的结果。我创建了几千个零大小的文件,并将它们移动到受监控的目录。没有溢出。
我错过了什么?
答案 0 :(得分:6)
“文件系统可以比检索事件更快地报告事件或 已处理并且实施可能会对此施加未指定的限制 它可能累积的事件数量。哪里有实施 故意丢弃事件然后它安排密钥的pollEvents 返回事件类型为OVERFLOW的元素的方法。这个事件 可以被消费者用作重新检查状态的触发器 对象。“
来自JavaDoc。
另见Steven C的回答。我认为他关于未消耗的事件的观点有所不同。
答案 1 :(得分:6)
我创建了几千个零大小的文件,并将它们移动到受监控的目录。没有溢出。
据推测,您在创建事件的同时消耗了这些事件。如果要触发溢出,请尝试暂停消耗事件,生成大量事件(如上所述),然后恢复消耗。操作系统可以缓冲的未消耗的事件的数量必然会有限制。
答案 2 :(得分:5)
产生溢出的最小示例
只需在watcherService.register
之后和watcherService.take
之前创建文件。
调用:
java Overflow 256
控制事件的数量。
Java 7和Ubuntu 14.04在512个事件中最大化。
每次发生溢出时,pollEvents()
只返回一个事件,但在Javadoc上没有明确指定。
我觉得很奇怪这个限制是如此之小,考虑到:
sysctl fs.inotify.max_user_watches
是524288
inotify
:http://hg.openjdk.java.net/jdk7u/jdk7u60/jdk/file/33c1eee28403/src/solaris/native/sun/nio/fs/LinuxWatchService.c#l36 代码:
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchService;
import java.util.List;
public class Overflow {
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
public static void main(final String[] args) throws InterruptedException, IOException {
int nfiles;
if (args.length > 0)
nfiles = Integer.parseInt(args[0]);
else
nfiles = 10_000;
Path directory = Files.createTempDirectory("watch-service-overflow");
final WatchService watchService = FileSystems.getDefault().newWatchService();
directory.register(
watchService,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE);
final Path p = directory.resolve(Paths.get("Hello World!"));
for (int i = 0; i < nfiles; i++) {
Files.createFile(p);
Files.delete(p);
}
List<WatchEvent<?>> events = watchService.take().pollEvents();
for (final WatchEvent<?> event : events) {
if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
System.out.println("Overflow.");
System.out.println("Number of events: " + events.size());
return;
}
}
System.out.println("No overflow.");
Files.delete(directory);
}
}