嗨akka gurus :)你能指導我這個嗎?Akka:等待多條消息
我正在試圖做的事 - 演員A向演員B詢問一條消息並等待一個人返回。但是,不知怎的,演員B不給A回覆一個消息,而是其中4個。演員A Future
正確完成,但其餘3條消息計爲死信。爲什麼?這是正確的嗎?我的意思是,演員A有一個合適的處理者,爲什麼這些信件都死了呢? :-(
[INFO] [2013年11月22日22:00:38.975] [ForkJoinPool -2-工人-7] [阿卡://男演員/用戶/ A]而獲得的結果的乒乓[INFO ] [2013年11月22日 22:00:38.976] [演員-akka.actor.default-調度-4] [阿卡://男演員/ deadLetters]消息[java.lang.String中]從 演員[阿卡:// 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的另一個消息。這裏棘手的部分是明文未來完成後等待 - 我只是無法讓我的想法得到該模型適合阿卡基礎。
但現在,我怎樣才能得到正確處理所有4條消息,沒有死信?謝謝:-D
是的人。謝謝你,你是最棒的:) –
你也可以在第一條消息中包含'sendAdditionaReplies:ActorRef'。 –