0

アクターシステムを設計しています。centerActor は、クライアントに応答するために、actor1 と actor2 の両方からの結果を待つ必要があります。

中央のアクター:

def receive: Receive ={
  case request => {
    implicit val timeout = Timeout(1.seconds)
    val ask1 = actor1 ? Update1.mapTo[Int]
    val ask2 = actor2 ? Update2.mapTo[String]
    val response =
      (for(x <- ask1; y <- ask2) yield Done).recover{case _ => FailReply}
    response pipeTo sender
  }
}

この設計では、送信者 (クライアント) はDoneメッセージを受信できません。どうしてか分かりません。だから私は2番目のデザインについて考えています:

def receive: Receive = {
  implicit val timeout = Timeout(1.seconds)
  case request => {
    val ask1 = actor1 ? Update1.mapTo[Int]
    val ask2 = actor2 ? Update2.mapTo[String]
    val response =
      (for(x <- ask1; y <- ask2) yield Done).recover{case _ => FailReply})
    response pipeTo self
    context.become(waiting(sender))
  }
}

def waiting(s: ActorRef) = {

    case Done => 
         s ! Done
         unstashAll()
         context.unbecome()
    case FailReply => s ! FailReply
    case _ => stash()

}
4

0 に答える 0