【发布时间】:2013-12-07 18:02:02
【问题描述】:
嗨,akka 大师:) 你能指导我吗?
我正在尝试做的事情 - 演员 A 向演员 B 请求消息,然后等待消息返回。但是,不知何故,演员 B 给 A 的不是一条消息,而是其中的 4 条。演员 A Future 正确完成,但其余 3 条消息被视为死信。为什么?这是正确的吗?我的意思是,演员 A 有一个合适的处理程序,那为什么这些字母是死的呢? :-(
[信息] [11/22/2013 22:00:38.975] [ForkJoinPool-2-worker-7] [akka://actors/user/a] 得到结果 pong [INFO] [11/22/2013 22:00:38.976] [actors-akka.actor.default-dispatcher-4] [akka://actors/deadLetters] 消息 [java.lang.String] 来自 演员[akka://actors/user/b#-759739990] 到 演员[akka://actors/deadLetters] 未交付。 [1] 死信 遭遇。可以关闭或调整此日志记录 配置设置“akka.log-dead-letters”和 'akka.log-dead-letters-during-shutdown'。 ...同样的消息 2 次以上...
请看代码。
package head_thrash
import akka.actor._
import akka.util.Timeout
import scala.concurrent.duration._
import akka.pattern.ask
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main extends App {
val system = ActorSystem("actors")
val a = system.actorOf(Props[A], "a")
val b = system.actorOf(Props[B], "b")
a ! "ping"
system.awaitTermination()
}
class A extends Actor with ActorLogging {
implicit val timeout = Timeout(5.seconds)
def receive = {
case "ping" => {
val b = context.actorSelection("../b")
val future: Future[String] = ask(b, "ping").mapTo[String]
future.onSuccess {
case result: String ⇒ {
log.info("Got result " + result) // <-- got result pong here, that's okay
}
}
}
case "pong" => {
log.info("hmmm...")
}
}
}
class B extends Actor with ActorLogging {
def receive = {
case "ping" => {
sender ! "pong"
sender ! "pong" // <-- dead letter!
sender ! "pong" // <-- dead letter!
sender ! "pong" // <-- dead letter!
}
}
}
这真的让我很困惑。现在你可以问 - 嘿,伙计,为什么你需要 B 发送很多消息?好吧,这是更复杂案例的一部分——A 向 B 询问消息。 B 回答。然后 A 等待 B 的另一条消息。这里的棘手部分是 plain 在 Future 完成后等待 - 我只是无法下定决心让该模型适合Akka 基础。
但是现在,我怎样才能正确处理所有 4 条消息而没有死信?谢谢:-D
【问题讨论】: