Java 7 WatchService - Ignorando várias ocorrências do mesmo evento
O javadoc paraStandardWatchEventKinds.ENTRY_MODIFY
diz:
Entrada de diretório modificada. Quando um diretório é registrado para este evento, o WatchKey é enfileirado quando se observa que uma entrada no diretório foi modificada. A contagem de eventos para este evento é 1 ou maior.
Quando você edita o conteúdo de um arquivo por meio de um editor, ele modifica a data (ou outros metadados) e o conteúdo. Você, portanto, recebe doisENTRY_MODIFY
eventos, mas cada um terá umcount
de 1 (pelo menos é o que estou vendo).
Estou tentando monitorar um arquivo de configuração (servers.cfg
previamente registrado com oWatchService
) que é atualizado manualmente (ou seja, através da linha de comandovi
) com o seguinte código:
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();
}
Desde que você tem doisENTRY_MODIFY
eventos, o acima iria recarregar a configuração duas vezes quando apenas uma vez é necessário. Existe alguma maneira de ignorar todos menos um deles, assumindo que poderia haver mais de um evento?
Se oWatchService
A API tem esse utilitário, tanto melhor. (Eu meio que não quero verificar os horários entre cada evento. Todos os métodos manipuladores no meu código são síncronos.
O mesmo ocorre se você criar (copiar / colar) um arquivo de um diretório para o diretório assistido. Como você pode combinar os dois em um evento?