发件人在未来

Jat*_*tin 19 scala akka

我有一个接收消息的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)