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