Освобождение ресурсов Java 7 WatchService

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

java.io.IOException: достигнут предел сетевых команд BIOS.

после 50 каталогов. Я уверен, что вызываю close() для каждого WatchService, который я создаю, прежде чем создавать новый.

Кто-нибудь знает, как правильно выпустить WatchService, чтобы вы не столкнулись с этим ограничением?

Спасибо,

Дэйв


person Dave    schedule 07.07.2012    source источник


Ответы (2)


Я думаю, что все вам нужно сделать, это close() сервис. Я знаю, вы сказали, что думаете, что уже делаете это, но я подозреваю, что вам чего-то не хватает. Например, вы могли не закрыть экземпляры службы в случае исключения. Вы должны рассматривать экземпляр WatchService как другие ресурсы ввода-вывода и закрывать его в блоке finally; например

WatchService ws = ...
try {
    // use it ...
} finally {
    ws.close();
}

или используя синтаксис Java 7 "попробовать с ресурсом".

try (WatchService ws = ...) {
    // use it ...
}

Когда WatchService закрывается, он должен немедленно освободить все ресурсы уровня O/S, которые он содержит.


Единственная другая возможность состоит в том, что вы столкнулись с какой-то ошибкой Java в реализации WatchService.

person Stephen C    schedule 07.07.2012

Если я правильно читаю Javadoc, вам нужен только один WatchService, который вы создаете в начале и close() в конце приложения.

Вы отправляете через .register пути и события, которые хотите зарегистрировать, по одному, и получаете обратно WatchKey. Вы храните эти WatchKeys, возможно, в ConcurrentMap с ключом Path.

Если вы хотите удалить его, просто вызовите метод cancel() для WatchKey и удалите его с карты.

WatchService

Path.Register

WatchKey

person MJB    schedule 07.07.2012