2012-03-06 23 views
33

WatchService trông giống như một công nghệ tuyệt vời nhưng nó quá chậm để có ích trên hệ điều hành OS X và Linux mà tôi đã thử nghiệm. Để thêm xúc phạm đến chấn thương, dường như nó cũng không được thông báo về tất cả các sự kiện.Dịch vụ WatchService của Java 7 có chậm cho bất kỳ ai khác không?

Đây là trường hợp cả với mã của riêng tôi và ví dụ kinh điển từ Oracle. (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)

tôi nhận ra rằng các cổng OS X OpenJDK là không chắc chắn về chức năng này (xem https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)

Có ai đã sử dụng này trong sản xuất với thành công?

+3

Đó là một rất khó chịu [biết vấn đề] (https://bugs.openjdk.java.net/browse/ JDK-7133447) từ năm 2012. – andruso

+1

Câu hỏi cho biết "OS X và Linux" nhưng câu trả lời và nhận xét dường như chỉ ra đây chỉ là vấn đề trên OS X. –

Trả lời

24

JDK 7 chưa có bản cài đặt WatchService gốc cho MacOS. Thay vì lắng nghe các sự kiện hệ thống tệp gốc, nó sử dụng sun.nio.fs.PollingWatchService dự phòng, định kỳ duyệt qua hệ thống tệp và kiểm tra dấu thời gian sửa đổi cuối cùng của mỗi tệp và thư mục con trong cây. Tôi cũng tìm thấy nó chậm một cách bất thường.

Có một thực hiện nguồn gốc của WatchService cho Mac:

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

tôi đã không cố gắng sử dụng nó bản thân mình.

+6

Đây có phải là trường hợp trong JDK 8 cho MacOS không? –

+2

@ben, rõ ràng là có. Chúng tôi vẫn gặp sự cố do nó rất chậm và không chọn tất cả các sự kiện. –

+2

Có vẻ như điều này sẽ không được giải quyết cho JDK 9. Vấn đề vẫn mở https://bugs.openjdk.java.net/browse/JDK-7133447 và không có giải pháp nào trong cuộc thảo luận trong danh sách gửi thư trước đây: http://mail.openjdk.java.net/pipermail/ nio-dev/2014-August/002691.html. –

30

Tôi có thời gian đáp ứng tốt hơn nhiều nếu tôi thay đổi

folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 

để

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

Lưu ý tốt hơn rằng StandardWatchEventKinds enum nằm trong các gói com.sun. *. – eskatos

+0

CÓ! đó là những gì đã làm cho tôi, tôi đã có 4 đến 5 giây chậm trễ cho đến khi tôi sử dụng nó. Để tham khảo kịch bản tôi đã tạo ở đây: https://gist.github.com/DinisCruz-Dev/9214909 –

+0

Tương tự đối với tôi, tôi đã trì hoãn ít nhất 4 giây và điều này làm cho nó hoạt động giống như nó (thông thường) hoạt động trên Linux hoặc Windows. Cảm ơn rất nhiều. –

Các vấn đề liên quan