2012-03-06 29 views
33

WatchService parece una tecnología excelente, pero ha sido demasiado lenta para ser útil en los sistemas OS X y Linux que he probado. Para colmo de males, tampoco parece que se notifiquen todos los eventos.¿Es Java 7 WatchService lento para cualquiera?

Este es el caso tanto con mi propio código como con el ejemplo canónico de Oracle. (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)

Reconozco que el puerto OS X OpenJDK no está seguro de esta funcionalidad (ver https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)

ha sido cualquier persona que utilice esta en la producción con éxito?

+3

Es un [problema conocido] muy molesto (https://bugs.openjdk.java.net/browse/ JDK-7133447) desde 2012. – andruso

+1

La pregunta indica "OS X y Linux" pero las respuestas y los comentarios parecen indicar que este es un problema solo en OS X. –

Respuesta

24

JDK 7 aún no tiene una implementación nativa de WatchService para MacOS. En lugar de escuchar los eventos del sistema de archivos nativos, utiliza la alternativa sun.nio.fs.PollingWatchService, que atraviesa periódicamente el sistema de archivos y verifica la última marca de tiempo modificada de cada archivo y subdirectorio en el árbol. También he encontrado que es inusualmente lento.

Hay una implementación nativa de WatchService para Mac:

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

no he tratado de usar yo mismo.

+6

¿Sigue siendo así en JDK 8 para MacOS? –

+2

@ben, aparentemente sí. Todavía estamos teniendo problemas debido a que es muy lento y no selecciona todos los eventos. –

+2

Parece que esto tampoco se resolverá para JDK 9. El problema sigue abierto https://bugs.openjdk.java.net/browse/JDK-7133447 y no hubo una resolución en la discusión anterior de la lista de correos: http://mail.openjdk.java.net/pipermail/ nio-dev/2014-August/002691.html. –

30

que tienen mucho mejores tiempos de respuesta si cambio

folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 

a

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

Tenga en cuenta que StandardWatchEventKinds enum está en paquetes com.sun. *. – eskatos

+0

¡SÍ! eso es lo que lo hizo para mí, tenía un retraso de 4 a 5 segundos hasta que lo usé. Como referencia, el script que creé está aquí: https://gist.github.com/DinisCruz-Dev/9214909 –

+0

Lo mismo para mí, tuve un retraso de al menos 4 segundos y esto hizo que funcionara como funciona (normalmente) en Linux o Windows. Muchas gracias. –