Sto utilizzando un servizio di controllo per monitorare una directory e attivare la logica sui file appena creati. Una delle sfide che ho sperimentato di recente è che un overflow viene attivato quando è necessario elaborare un volume elevato di file e viene copiato nella directory di controllo troppo veloce da gestire.Come gestisco correttamente il tipo di overflow pollEvents() in un servizio di vigilanza?
Il API dice questo di overflow:
I file system possono segnalare gli eventi più velocemente di quanto possano essere recuperati o trattati e un'implementazione possono imporre un limite specificato il numero di eventi che si può accumulare. Quando un'implementazione scarta consapevolmente gli eventi, ordina il metodo pollEvents della chiave per restituire un elemento con un tipo di evento OVERFLOW.
La mia domanda è, come posso gestire correttamente l'overflow, senza perdere nessuno degli eventi che devono essere elaborati?
Il mio codice watchservice assomiglia:
Path myDir = Paths.get(srcDir);
try(WatchService watcher = myDir.getFileSystem().newWatchService()){
myDir.register(watcher, ENTRY_CREATE,ENTRY_MODIFY);
int x = 0;
for(;;){
x++;
WatchKey watchKey = watcher.take();
LOGGER.debug("Event # {}",x);
List<WatchEvent<?>> events = watchKey.pollEvents();
LOGGER.info("Events Size {}",events.size());
for (WatchEvent event : events) {
if(event.kind() == OVERFLOW){
LOGGER.error("The Maximum watchService events has been reached!");
System.exit(1); //I exit so I know there is a problem - but how should I handle this?
}
if (event.kind() == ENTRY_CREATE) {
LOGGER.info("File created: " + event.context().toString());
LOGGER.info("Beginning Processing:" +event.context().toString());
...business logic here...
}
}
watchKey.reset();
}
...
Un overflow * significa * hai perso eventi. Non ha senso dire che vuoi gestire un overflow e non perdere gli eventi. –
@PeterLawrey La documentazione afferma inoltre 'Questo evento può essere utilizzato dal consumatore come trigger per riesaminare lo stato dell'oggetto. Se perdo un evento a causa di un overflow, i miei prossimi eventi si accodano ancora? e se sì, come posso ottenere il prossimo set di eventi? –