Java 7 NIO watchservice против jpathwatch

Проект, над которым я работаю, использует Java 6 и jpathwatch (.95) и в настоящее время обновляется до Java 7. В настоящее время на Windows 7 и 2008 Server. Я занимаюсь рефакторингом областей кода, чтобы использовать новый Java 7 NIO, и это относительно просто - даже используя NIO.2 для замены jpathwatch. Однако область просмотра файлов нашего кода стала давать сбой модульным тестам. Кажется, Java 7 NIO не будет воспринимать изменения в UNC-путях к другим машинам -

\\otherMach\path\to\watch.  

Для тестирования я реализовал код с учебного сайта по Java NIO http://docs.oracle.com/javase/tutorial/essential/io/fileio.html а затем создал дублирующий класс, заменяющий в импорте jpathwwatch вместо Java NIO импорт. jpathwatch работает для путей UNC, а Java NIO - нет. Кажется, что он регистрируется и даже возвращает начальный ключ события для местоположения: (пример вывода)

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: sun.nio.fs.WindowsWatchService$WindowsWatchKey@1f26ecd2
INFO: event key for: \\otherMach\path\to\watch

но потом никогда не признает каких-либо дальнейших изменений.

jpathwatch регистрирует и сообщает о событиях каталога и файла (хотя он не сообщает о начальном событии сразу после регистрации).

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New folder
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New Text Document.txt

Несмотря на то, что в обсуждении jpathwatch видно, что сетевое наблюдение НЕ поддерживается - обратите внимание на ответ Уве Пахлера, ссылающийся на пути UNC - http://sourceforge.net/p/jpathwatch/discussion/888207/thread/8ea778de/?limit=25

Кому-нибудь повезло с просмотром путей UNC и Java 7 NIO.2? Любые другие или более свежие решения?

Спасибо,

-mjash

3 ответа

Похоже, что это ошибка в JDK, которая была исправлена ​​в JDK 1.7.0_u60. Я только что попробовал u71 (использовал u45) и убедился, что теперь он работает для меня через UNC.

Хотя в действительности нет четкого описания путей UNC и удаленных файловых систем в целом, вот что я обнаружил:

Сначала кажется возможным зарегистрировать WatchKey, но сразу же WatchKey делает недействительным (WatchKey.isValid()).

Из-за прямого подключения к файловой системе невозможно зарегистрировать WatchKey в удаленном месте.

Возможные обходные пути:

1. Удаленный FileWatcher

Поделитесь списком путей для просмотра на удаленном jvm и позвольте ему переслать изменения на ваш компьютер.

2. Опрос

Другим обходным решением будет опрос (только рекомендуемый, если не критичный по времени).
Если вы будете опрашивать постоянно, это вызовет много сетевого трафика.

Было бы неплохо либо получить исключение при регистрации на удаленном пути, либо по крайней мере прочитать это в When to Use and Not Use This API раздел.

Если вы используете учебное пособие и примеры из документации Oracle по WatchEvent, возможно, вы пропустили вызов key.reset() после обработки события. Я просто столкнулся с той же проблемой:

    void processEvent(){
    for(;;){
        WatchKey key;           
        try {
            key = this.watcher.take();
        } catch (InterruptedException ex){
            return;
        }

        for(WatchEvent<?> event: key.pollEvents()){
            WatchEvent<Path> newevent = (WatchEvent<Path>)event;
            Path filepath = newevent.context();

        ... clipped ....
        }

        boolean valid = key.reset();
        if(!valid){
            break;
        }
    }
Другие вопросы по тегам