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