Непоследовательное поведение JNotify на разных версиях Windows

Наши продукты в настоящее время используют JDK 1.6, поэтому мы должны полагаться на JNotify для изменений файловой системы. Однако во время теста я заметил, что что-то, что отлично работало в моей среде разработки Win 7, перестало работать в XP и win server 2003. Поэтому я перешел к написанию небольшой тестовой программы. Вот как это выглядит примерно.

В основном классе у меня есть только это:

public static void main(String[] args) {
    SyncUtil instance = new SyncUtil();
    instance.start();

    Scanner s = new Scanner(System.in);
    s.nextLine();
}

SyncUtil - это класс, расширяющий потоки:

    public void run() {
        String path = "D:\\testFolder";
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        boolean watchSubtree = true;
        File file = null;
        try {
            JNotify.addWatch(path, mask, watchSubtree, new Listener());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

У класса Listener нет работы внутри, он просто печатает журнал. Теперь, если я запускаю приведенный выше пример на Windows 7 / 8. Он будет работать нормально. Но когда я тестирую его на Win Server 2003, JNotify просто перестает работать, и слушатель вообще не печатает никаких журналов.

Что еще интереснее, если я попытаюсь заставить SyncUtil подождать минуту после его работы. Если я добавлю:

Thread.sleep(60000);

до конца функции запуска, чтобы заставить его ждать в течение 60 секунд. И вместо того, чтобы следить за 1 папкой, на этот раз я буду контролировать 2, я назову их папками A и B.

В этом случае на компьютере с Win Server 2003 происходит следующее: если я добавлю файл в папку A в течение времени ожидания 60-х годов, JNotify правильно отреагирует на событие и напечатает журнал. И он будет продолжать работать, даже если прошло 60 с, а поток SyncUtil завершен. Но теперь я добавляю файл в папку B (по истечении 60 секунд ожидания) ничего не будет напечатано.

Подводя итог, можно сказать, что симптом: 1. В случае выигрыша 7 и выигрыша 8 JNotify будет продолжать работать независимо от того, поддерживает ли поток вызовы JNotify.addWatch(). 2. На win XP и win server 2003 JNotify может правильно генерировать событие, когда поток вызывает JNotify.addWatch(). Пути, которые сгенерировали хотя бы одно событие, когда этот поток все еще жив, будут продолжать отслеживаться после завершения этого потока. Но те пути, которые не генерировали никакого события, когда упомянутый поток жив, не будут работать после того, как этот поток завершен.

Теперь, зная этот паттерн, я в настоящее время использую CountDownLatch для решения этой проблемы, но мне просто очень любопытно, почему это происходит. Я чувствую, что в этом нет никакого смысла, как вы думаете, в чем проблема? Я склоняюсь к выводу, что, возможно, Windows вызывает событие файловой системы по-другому? Как вы думаете, это может быть так?

1 ответ

Это очень странно, но: добавление часов - это действительно быстрая операция, почему вы добавляете их в поток?

Другие вопросы по тегам