据我所知,演员可以发送一条消息“火与忘”的风格!运营商,或“发送 - 接收 - 未来”风格与?运营商。通过消息传递的演员?必须调用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个版本的演员!和演员的第二个版本?
答案 0 :(得分:2)
如果senderFuture.isDefined,那么你有一个回复
的未来