Java 7 WatchService: избегание бесконечного цикла событий при изменении источника события в обработчике - PullRequest
4 голосов
/ 03 декабря 2011

По сути, я использую новый Java 7 WatchService для мониторинга каталога.

У меня есть цепочка обработчиков, слушающих каждое событие ввода-вывода, выданное каталогом.

Проблема в том, что некоторые обработчики должны каким-то образом изменить причину этих событий ввода-вывода (== файлы). Например, если кто-то помещает файл в отслеживаемую папку, один из обработчиков может изменить его расширение, добавить что-либо к его имени файла или что-то еще.

Эти действия, конечно, инициируют новые события ввода-вывода, и вышеупомянутые обработчики получают их. Затем они снова делают свои изменения. Это, очевидно, приводит к бесконечному циклу ...

Предлагает ли Java какой-либо способ справиться с такой ситуацией? Если нет, как бы вы справились с этим?

Обычно я хотел бы запускать свои обработчики событий только тогда, когда событие не было вызвано действием этих обработчиков.

ОБНОВЛЕНИЕ: Что касается решения, я бы предпочел внести изменения только в код маршрутизатора основного события, чем беспокоиться об этом в каждом обработчике, который я пишу («обработчик вносит изменения только в случае, если не делай этого раньше ").

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Это приводит к бесконечному циклу, только если нет базового случая.

Предположим, что люди помещают файлы в каталог с расширением '.bar', а вы хотите расширение '.foo', так что ваш обработчик делает это изменение тогда и только тогда, когда текущее расширение - '.bar .

Даже если ваш обработчик все равно получит событие для нового <file>.foo, вы можете отменить его, остановив "бесконечное" распространение события.

0 голосов
/ 03 декабря 2011

Я предлагаю использовать новый поток каждый раз, когда ваш код, обрабатывающий событие, вызовет новое событие.Внутри дескриптора события проверьте, нужно ли переименовывать измененный файл, если да, запустите новый поток, выполняющий переименование, если нет возврата из события.Делая это таким образом, избегайте бесконечных циклов, так как код обработки событий завершается любым образом.

...