Java 7 WatchService - Ignorowanie wielu wystąpień tego samego zdarzenia
Javadoc dlaStandardWatchEventKinds.ENTRY_MODIFY
mówi:
Zmodyfikowano wpis katalogu. Gdy katalog jest zarejestrowany dla tego zdarzenia, wówczas WatchKey jest ustawiany w kolejce, gdy zauważono, że wpis w katalogu został zmodyfikowany. Liczba zdarzeń dla tego wydarzenia wynosi 1 lub więcej.
Podczas edycji zawartości pliku za pomocą edytora zmodyfikuje zarówno datę (lub inne metadane), jak i treść. Otrzymujesz dwaENTRY_MODIFY
wydarzenia, ale każdy będzie miałcount
z 1 (przynajmniej tak widzę).
Próbuję monitorować plik konfiguracyjny (servers.cfg
wcześniej zarejestrowany wWatchService
), który jest ręcznie aktualizowany (np. przez wiersz poleceńvi
) z następującym kodem:
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();
}
Od kiedy masz dwaENTRY_MODIFY
zdarzenia, powyższe przeładowałoby konfigurację dwukrotnie, gdy tylko jeden raz jest potrzebny. Czy jest jakiś sposób na zignorowanie wszystkich oprócz jednego, zakładając, że może istnieć więcej niż jedno takie zdarzenie?
JeśliWatchService
API ma takie narzędzie tym lepiej. (W pewnym sensie nie chcę sprawdzać czasów między poszczególnymi zdarzeniami. Wszystkie metody obsługi w moim kodzie są synchroniczne.
To samo dotyczy tworzenia (kopiowania / wklejania) pliku z jednego katalogu do katalogu obserwowanego. Jak połączyć oba te wydarzenia w jedno?