我有一个接收消息的actor,在文件系统中搜索文件并返回File的完整路径.
为了保持异步,我做了:
def receive = {
case s:String => {
val f = future{
val ans = search(s)
println("Input Request: "+s+" output:"+ans+" "+sender.path)
}
f.onComplete{
case Success(x) => sender ! x
case Failure(y) => println("Could not complete it")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我观察到它将消息返回给akka://FileSystem/deadLetters而不是sender.文档说:
仅在Actor本身内有效,所以不要关闭它并将其发布到其他线程!
这是什么意思,我必须保持同步?还有其他方法吗?
ste*_*tew 44
你正在犯一个"关闭可变状态"的错误.你传递给的闭包onComplete不会复制this.sender,所以当你onComplete被调用时,你会将消息发送到this.sender当时发生的任何事情,而不是创建闭包时指向的内容.
您可以通过创建自己的当前内容的本地不可变副本来避免此问题this.sender,并在闭包中引用该值:
val origSender = sender
f.onComplete {
case Successs(x) => origSender ! x
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3932 次 |
| 最近记录: |