Ho riscontrato un problema con WatchService. Ecco un frammento del mio codice:WatchService: eventi mancati e non gestiti
public void watch(){
//define a folder root
Path myDir = Paths.get(rootDir+"InputFiles/"+dirName+"/request");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
//stuff
}
}catch(Exception e){}
watckKey.reset();
}
* Prima di tutto, sanno che orologio() viene chiamato all'interno di un ciclo infinito.
Il problema è che quando si creano più file alla volta, mancano alcuni eventi. Ad esempio, se copio tre file nella cartella ".../request", ne viene catturato solo uno, gli altri rimangono come se nulla fosse accaduto, né viene attivato un evento OVERFLOW. In alcuni computer e sistemi operativi diversi, raggiunge fino a due file, ma se si tenta di eseguire 3 o più, il resto rimane intatto.
Ho trovato una soluzione, ma non penso che sia la migliore pratica. Questo è il flusso:
Le avviato il processo e quindi si arresta
WatchKey watckKey = watcher.take();
come previsto, (come da Processing events). Quindi, faccio cadere 3 file insieme nella cartella "richiesta", quindi, riprende il processo al
List<WatchEvent<?>> events = watckKey.pollEvents();
Il problema è qui. Sembra che il filo passi così velocemente attraverso questa linea che due eventi CREATI rimangono indietro e sono persi, ne viene preso solo uno. La soluzione era quella di aggiungere una riga aggiuntiva proprio sopra questo, come questo:
Thread.sleep(1000);
List<WatchEvent<?>> events = watckKey.pollEvents();
questa sembra essere una soluzione, almeno per tre e diversi file più contemporaneamente, ma non è scalabile a tutti. Quindi, in conclusione, vorrei sapere se esiste una soluzione migliore per questo problema. A proposito, sto gestendo una Win 7 64
Grazie mille in anticipo!
Ad un certo punto nel mio codice ho fatto questo, ho preso la creazione del servizio orologio fuori dal ciclo infinito. Non ricordo esattamente perché, e non ho provato di nuovo questa situazione. La soluzione alternativa è ancora lì comunque – McCoy