2015-02-26 15 views
13

Tôi có mã làm việc để nghe thư mục bằng cách sử dụng WatchService và trả lời các sự kiện tôi chỉ định. Điều này hoạt động tốt và đã được thử nghiệm trên cả linux và mac (mặc dù sau này rõ ràng là bỏ phiếu được sử dụng).Có cách nào để bỏ phiếu bằng cách sử dụng WatchService không?

Tuy nhiên, khi tôi triển khai điều này trong sản xuất, hóa ra thư mục đang được theo dõi là gắn kết NFS. Vì WatchService sử dụng inotify khi chạy trên linux nên không bao giờ có bất kỳ sự kiện nào được kích hoạt bởi vì NFS mounts không kích hoạt sự kiện inotify (hoặc một cái gì đó như thế này, có thêm thông tin ở đây, giải thích vấn đề của tôi: Java WatchService not generating events while watching mapped drives).

Vì mã của tôi đã được viết nên tôi muốn ép WatchService sử dụng việc thực hiện bỏ phiếu thay vì thực hiện việc inotify. Có cách nào để làm việc này không?

Tôi đã cố gắng này bằng cách tìm các mã nguồn sun.nio.fs.PollingWatchService và tạo ra một đối tượng trực tiếp (thay vì sử dụng FileSystems.getDefault() newWatchService().) Nhưng khi đăng ký dịch vụ với con đường tôi đã ngoại lệ này : java.nio.file.ProviderMismatchException.

Vì vậy, có ý tưởng nào không? Vì tôi đã triển khai mã bằng cách sử dụng API WatchService và WatchKey nên sẽ dễ dàng hơn nhiều khi chỉ thực hiện việc bỏ phiếu hơn là viết lại mọi thứ bằng cách sử dụng trình đẩy tùy chỉnh hoặc bên thứ ba. Cảm ơn!

+0

Đây là loại chậm và không hiệu quả nhưng những gì về file 'f = new File (YOUR_DIRECTORY, "_garbage.tmp"); new FileOutputStream (f) .đóng(); f.delete(); 'và chỉ lắng nghe việc tạo các tệp có tên' "_garbage.tmp" '? –

+0

@k_g: Cảm ơn bạn đã trả lời nhưng tôi không hiểu làm thế nào để giúp. Bất kỳ cơ hội bạn có thể xây dựng? – rjcarr

+0

Nếu bạn tạo tệp rồi xóa tệp, tệp sẽ kích hoạt sự kiện WatchService, phải không? –

Trả lời

2

Bạn có thể thử jpoller dự án nguồn mở. Nó thực hiện một lớp có tên là DirectoryPoller định kỳ thăm dò nội dung của một hoặc nhiều thư mục. Đây là một chuỗi định kỳ tìm kiếm các tệp mới bằng cách sử dụng thời gian sửa đổi tệp cuối cùng. Để tải xuống nguồn bạn có thể truy cập http://jpoller.sourceforge.net/ Thành thật mà nói, tôi đã không sử dụng jpoller. Tôi đã sử dụng các sự kiện JDK 7 WatcherService.

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