Java7 WatcheService事件未接收
我肯定我在做一些愚蠢的事情,但我不能让我的头围绕它,所以也许有人可以在这里发光 我围绕java的watchService编写了最简单的scala包装器,以便用事件回调: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
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
}
}
}