一个Akka演员必须区分,当一条消息通过时,是否会有一个返回的未来?

时间:2012-02-01 20:09:16

标签: akka actor

据我所知,演员可以发送一条消息“火与忘”的风格!运营商,或“发送 - 接收 - 未来”风格与?运营商。通过消息传递的演员?必须调用self.reply或发件人将收到超时异常。另一方面,通过消息传递的演员!如果消息没有从另一个角色传递,则不能自我复制。

我的问题是,Actor是否应该在编译时知道它是否会被调用!要么 ? ???或者,如果可以在运行时确定self.reply的必要性,那么如何确定?也许是self.tryReply,但是akka文档似乎暗示失败的回复尝试是一个错误的情况,而如果发件人不是一个演员,如果邮件传递的话,那么回复失败并不是一个错误!

编辑:

以下是一些代码:

package akTest

import akka.actor.Actor

object Main1 {
  val worker = Actor.actorOf[ak].start()

  def main(args: Array[String]) {
    val resp = worker ? "Hi"
    resp.get
    println(resp)
  }
}

class ak extends Actor {
  def receive = {
    case msg:String  => {
      val response = "Received: " + msg
      println(response)
      response
    }
  }
}

这样 Exception in thread "main" akka.dispatch.FutureTimeoutException: Futures timed out after [4995] milliseconds

所以我给演员添加了一个self.reply:

class ak extends Actor {
  def receive = {
    case msg:String  => {
      val response = "Received: " + msg
      println(response)
      self.reply(response)
      response
    }
  }
}

此更改修复了超时错误。但是现在如果我有一个发送火灾并忘记消息的Main2:

object Main2 {
  val worker = Actor.actorOf[ak].start()

  def main(args: Array[String]) {
    val resp = worker ! "Hi"
    println(resp)
  }
}

,产生了一个新错误:[ERROR] [2/1/12 2:04 PM] [akka:event-driven:dispatcher:global-1] [LocalActorRef] No sender in scope, can't reply.

如何编写我的actor以消除其响应方式与发送方调用方法之间的耦合?我不想拥有1个版本的演员!和演员的第二个版本?

1 个答案:

答案 0 :(得分:2)

如果senderFuture.isDefined,那么你有一个回复

的未来