Root удаление папки делает java .nio.file.WatchService зомби ie. Как обнаружить? - PullRequest
0 голосов
/ 02 марта 2020

Я пытался реализовать службу, которая отслеживает каталог на предмет изменений в файлах (создание, удаление, изменение) с помощью java.nio.file.WatchService. Это работает довольно хорошо, за исключением случаев, когда я пытаюсь удалить папку "root", в которой зарегистрирован WatchService. В этом случае не генерируется событие или исключение, и служба продолжает работать.

В качестве подтверждения концепции я использую следующий код:

import java.nio.file._
import java.util.concurrent.TimeUnit
object FileWatcher {
  def main(args: Array[String]) = {
    val path : Path = Paths.get("/somefolder");
    val watchService = FileSystems.getDefault.newWatchService

    val WATCH_KINDS = Array[WatchEvent.Kind[_]](
      StandardWatchEventKinds.ENTRY_CREATE, 
      StandardWatchEventKinds.ENTRY_DELETE,
      StandardWatchEventKinds.ENTRY_MODIFY,
      StandardWatchEventKinds.OVERFLOW
    )

    path.register(watchService, WATCH_KINDS)

    while ({true}) try {
      val key = watchService.take
      import scala.collection.JavaConversions._
      for (event <- key.pollEvents) {
        val kind = event.kind
        println(kind.toString)
      }
      key.reset()
    } catch {
      case x: Throwable =>
        println(s"${x.getMessage}")
    } 
  }
}

Приведенный выше код без проблем обнаруживает ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE события.

Однако в момент удаления /somefolder ничего не происходит, и служба продолжает работать. Повторное создание /somefolder не заставит WatchService возобновить обнаружение событий на /somefolder. Нет исключений.

Как я могу обнаружить эту ситуацию? В настоящее время FileWatcher продолжает работать, и нет никакого способа узнать, работает ли он по-прежнему / полезно / обнаруживает события.

...