0

I am designing an actor system. centerActor need to wait result from both actor1 and actor2 to response to the client.

In the centerActor:

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
  }
}

In this design, my sender(client) cannot receive Done message. I don't know why. So I am thinking about the second design:

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()

}
Mel
  • 5,837
  • 10
  • 37
  • 42
hminle
  • 501
  • 1
  • 8
  • 19

0 Answers0