Java 7 WatchService - Ignoriert mehrere Vorkommen desselben Ereignisses
Der Javadoc fürStandardWatchEventKinds.ENTRY_MODIFY
sagt:
Verzeichniseintrag geändert. Wenn ein Verzeichnis für dieses Ereignis registriert ist, wird der WatchKey in die Warteschlange gestellt, wenn festgestellt wird, dass ein Eintrag im Verzeichnis geändert wurde. Die Ereignisanzahl für dieses Ereignis beträgt 1 oder mehr.
Wenn Sie den Inhalt einer Datei über einen Editor bearbeiten, werden sowohl das Datum (oder andere Metadaten) als auch der Inhalt geändert. Sie erhalten also zweiENTRY_MODIFY
Ereignisse, aber jeder wird eine habencount
von 1 (zumindest sehe ich das).
Ich versuche eine Konfigurationsdatei zu überwachen (servers.cfg
zuvor registriert bei derWatchService
), die manuell aktualisiert wird (dh über die Befehlszeilevi
) mit folgendem Code:
while(true) {
watchKey = watchService.take(); // blocks
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
WatchEvent.Kind<Path> kind = watchEvent.kind();
System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
// prints (loop on the while twice)
// servers.cfg, count: 1, event: ENTRY_MODIFY
// servers.cfg, count: 1, event: ENTRY_MODIFY
switch(kind.name()) {
case "ENTRY_MODIFY":
handleModify(watchEvent.context()); // reload configuration class
break;
case "ENTRY_DELETE":
handleDelete(watchEvent.context()); // do something else
break;
}
}
watchKey.reset();
}
Da bekommt man zweiENTRY_MODIFY
In diesem Fall würde die Konfiguration zweimal neu geladen, wenn nur einmal benötigt wird. Gibt es eine Möglichkeit, alle außer einem dieser Ereignisse zu ignorieren, vorausgesetzt, es könnte mehr als ein solches Ereignis geben?
Wenn dasWatchService
API hat ein solches Dienstprogramm umso besser. (Ich möchte nicht die Zeiten zwischen den einzelnen Ereignissen überprüfen. Alle Handlermethoden in meinem Code sind synchron.
Dasselbe passiert, wenn Sie eine Datei aus einem Verzeichnis in das überwachte Verzeichnis kopieren / einfügen. Wie kann man beides zu einem Event kombinieren?