Java7 WatcheService事件未接收

Java7 WatcheService事件未接收,java,scala,akka,watchservice,Java,Scala,Akka,Watchservice,我肯定我在做一些愚蠢的事情,但我不能让我的头围绕它,所以也许有人可以在这里发光 我围绕java的watchService编写了最简单的scala包装器,以便用事件回调: object Watcher { def start(path: Path)(listener: ((String,Path)) => Unit) { val watchService = FileSystems.getDefault.newWatchService path.register(watc

我肯定我在做一些愚蠢的事情,但我不能让我的头围绕它,所以也许有人可以在这里发光

我围绕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
        }
      }
    }
  }
}
除了我自己,我没有责备任何人,但这让我发疯:)

代码非常小,但我没有在这里复制所有内容,而是将代码发布在github上(只是更容易复制):

有人想帮我吗


PS:我使用的是Linux 3.11.6-200.fc19.x86_64

注意:如果我在运行akka测试时触摸命令行上的文件,我会看到事件,因此akka与其说是问题,不如说是我的测试方法问题。我看了您的示例。Akka示例运行良好,只是
watchService
应该在实际创建文件之前启动。在您向
WatcherActor
发送消息后,它应该同步或至少增加延迟!!我就知道这会很痛!我确实忽略了这样一个事实:第一个“告诉”调用是异步的!谢谢你!我可以在创建文件之前添加一个“expectNoMsg”,它就可以工作了……好吧,既然我已经愚弄了自己,我想把这件事搞清楚。我的测试仍然非常不稳定:每隔一段时间,其中一个(或两个)测试都会失败,因为我会得到一个额外的(第三个)修改事件,当我期望删除(预期的(条目_DELETE,file2-58117749905980517765),发现(条目_MODIFY,file2-58117749905980517765))。这次与akka无关,可能更多的是我对测试文件的使用。。。(我已经更新了github)是的。我也一样。但是修改和删除在同一个
监视键中提交的事件。它似乎是平台特定的东西(谁知道引擎盖下到底发生了什么?)。也许最好从
pollEvents
中取最后一个。但在这种情况下,您可能会丢失一些有用的数据。。。
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
      }
  }
}