Java 7 WatchService事件未收到

时间:2014-02-10 10:59:20

标签: java scala akka watchservice

我确定我对这个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

0 个答案:

没有答案