2012-03-06 15 views
33

WatchService sembra una grande tecnologia ma è stato troppo lento per essere utile sui sistemi OS X e Linux su cui ho provato. Per aggiungere la beffa al danno, non sembra che venga notificato di tutti gli eventi.Java 7 WatchService è lento per chiunque altro?

Questo è il caso sia del mio codice che dell'esempio canonico di Oracle. (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)

riconosco che la porta OS X OpenJDK è sicuro di questa funzionalità (vedi https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)

qualcuno ha utilizzato questo in produzione con successo?

+3

E 'molto fastidioso [problema noto] (https://bugs.openjdk.java.net/browse/ JDK-7133447) dal 2012. – andruso

+1

La domanda indica "OS X e Linux" ma le risposte e i commenti sembrano indicare che questo è un problema solo su OS X. –

risposta

24

JDK 7 non ha ancora un'implementazione nativa di WatchService per MacOS. Anziché ascoltare eventi del file system nativo, utilizza il fallback sun.nio.fs.PollingWatchService, che periodicamente attraversa il file system e controlla l'ultima data/ora modificata di ogni file e sottodirectory nell'albero. Ho anche trovato che è insolitamente lento.

C'è un'implementazione nativa di WatchService per Mac:

http://code.google.com/p/barbarywatchservice/

Non ho provato ad usarlo io stesso.

+6

E 'ancora così in JDK 8 per MacOS? –

+2

@ben, a quanto pare si. Abbiamo ancora problemi dovuti al fatto che è molto lento e non raccoglie tutti gli eventi. –

+2

Sembra che questo non sarà risolto nemmeno per JDK 9. Il problema è ancora aperto https://bugs.openjdk.java.net/browse/JDK-7133447 e non c'era una risoluzione nella precedente discussione sulla mailing list: http://mail.openjdk.java.net/pipermail/ nio-dev/2014-August/002691.html. –

30

devo molto migliori tempi di risposta se cambio

folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 

a

folder.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH); 
+1

Meglio notare che l'enum di StandardWatchEventKinds è nei pacchetti com.sun. *. – eskatos

+0

SÌ! questo è ciò che ha reso questo per me, ho dovuto aspettare dai 4 ai 5 secondi finché non l'ho usato. Per riferimento lo script che ho creato è qui: https://gist.github.com/DinisCruz-Dev/9214909 –

+0

Lo stesso per me, ho avuto un ritardo di almeno 4 secondi e questo ha funzionato come se (normalmente) funzionasse su Linux o Windows. Molte grazie. –