Akka参与者必须区分,当消息传递时,是否期望返回未来?

Akka参与者必须区分,当消息传递时,是否期望返回未来?,akka,actor,Akka,Actor,据我所知,一个演员可以发送一个信息“火和忘记”的风格和!操作员,还是“发送和接收未来”样式?操作人员一个演员通过什么途径传递信息?必须调用self.reply,否则发件人将收到超时异常。另一方面,一个演员通过!如果消息未从其他参与者传递,则无法具有self.reply 我的问题是,参与者是否应该在编译时知道它是否会被调用!或或者,如果可以在运行时确定self.reply的必要性,那么如何确定?可能涉及self.tryReply,但akka文档似乎暗示,尝试回复失败是一种错误情况,而如果发送者不是

据我所知,一个演员可以发送一个信息“火和忘记”的风格和!操作员,还是“发送和接收未来”样式?操作人员一个演员通过什么途径传递信息?必须调用self.reply,否则发件人将收到超时异常。另一方面,一个演员通过!如果消息未从其他参与者传递,则无法具有self.reply

我的问题是,参与者是否应该在编译时知道它是否会被调用!或或者,如果可以在运行时确定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
    }
  }
}
这是
线程“main”akka.dispatch.FutureTimeoutException中的异常:期货在[4995]毫秒后超时

所以我给演员添加了一个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]
范围内没有发件人,无法答复。


如何编写我的actor来消除其响应方式与发送方调用方法之间的耦合?我不想有一个版本的演员!如果senderFuture.isDefined,那么你有一个未来可以回答

我正在阅读所有这些Akka问题,它们都有一个共同点:几乎没有一个能证明解决方案。这就是这个地方的全部意义。[顺便说一句,文档和示例显然不够清晰。]如果您希望改进文档,您需要报告需要在ML上修复的内容,或者直接打开票据,因为这是我们的反馈渠道。我不会在上面变出代码,因为首先,我没有时间这么做,其次,因为它没有被编译,因此可能很容易过时。嗯,我在一周前的帖子中给出了一个完美的例子:文档中使用Actors的每一个例子都让它们并行地做了一大堆事情,然后让侦听器向控制台发出消息并终止。完全没用。下面是一些有用的方法:告诉我如何将消息发送给参与者,让其将工作分配给其他参与者,然后将结果返回给REST服务,以便它可以将其发送回去。如果您需要更多帮助,请查看Spray文档:他们的第一页显示了如何完成此操作。另一方面,您的文档…显示调用tell然后阻塞,然后立即说不要这样做,但它提供的唯一替代方案是合成期货,即不基于参与者。我无法想象此刻还有什么不清楚的地方。文档中描述了如何打开票据: