2

我确定我在用这个 WatchService 做一些愚蠢的事情,但我无法理解它,所以也许有人可以在这里阐明一下..

我围绕 java 的 watchService 编写了最简单的 scala 包装器,以便通过事件回调:

object Watcher {
  def start(path: Path)(listener: ((String,Path)) => Unit) {
    val watchService = FileSystems.getDefault.newWatchService
    path.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE)

    var loop = true

    future {
      while(loop) {
        println("take...")
        for {
          key <- Try(watchService.take) 
          ev <- key.pollEvents
        } {
          println(ev.kind.name)
          listener((ev.kind.name, ev.context.asInstanceOf[Path]))
          if (!key.reset) loop = false
        }
      }
    }
  }
}

现在,如果我在一个简单的“主”程序中手动运行它,它会完全按照应有的方式运行:文件创建在同一个循环迭代中给了我一个 ENTRY_CREATE 和 ENTRY_MODIFY 事件(为什么不),然后修改给了我另一个ENTRY_MODIFY,最后一个删除给了我一个ENTRY_DELETE。

到目前为止,一切都很好。

现在我尝试将其包装在 akka 中,以便将事件发送给演员,并且.. 我的 watchService 似乎只是卡在拍摄中并且没有从那里出来!

class WatcherActor extends Actor {
  import Watcher._
  def receive = {
    case path: String =>
      val to = sender
      start(Paths.get(path)) { evt =>
        println(s"$evt => $to")
        to ! evt
      }
  }
}

除了我自己,我没有责怪任何人,但这让我发疯:)

代码非常小,但我没有在此处复制所有内容,而是将代码发布在 github 上(更容易重现): https ://github.com/joune/watcher

有人想在这里帮我一把吗?

PS:我在 Linux 3.11.6-200.fc19.x86_64

4

0 回答 0