Получено ли сообщение об изменении шаблона запроса? - PullRequest
0 голосов
/ 15 января 2019

Я определяю следующие сообщения и актеры:

case class Message1(text: String)
case class Message2(text: String)
case class Message3(text: String)

class Actor1(actor2: ActorRef) extends Actor {
    def receive = {
        case Message1(text) =>
            (actor2 ? Message2(text)).mapTo[Message3].foreach(self ! _)
        case Message3(text) =>
            println(s"Got the message[$sender]: " + text)
    }
}

class Actor2 extends Actor {
    def receive = {
        case Message2(text) =>
            println(s"Actor2[$self] received: " + text)
            sender ! Message3("Received message1: " + text)
    }
}

def main(args: Array[String]): Unit = {

    val system = ActorSystem("Test")
    system.actorOf(Props(new Actor1(system.actorOf(Props(new Actor2))))) ! Message1("Hello")
}

Когда я запускаю этот код, вывод, когда Message3 получен Actor1, подразумевает, что он получает только Message3, отправленное из Future.foreach, а не то, что отправлено обратно Actor2 - так как это обрабатывается шаблоном ask.

Итак, мой вопрос: всегда ли это ожидаемое поведение?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

ask (?) создает внутреннего субъекта для обработки ответов. В общем, используйте tell (!) вместо ask для взаимодействия между участниками:

class Actor1(actor2: ActorRef) extends Actor {
  def receive = {
    case Message1(text) =>
      actor2 ! Message2(text)
    case Message3(text) =>
      println(s"Got the message[$sender]: $text")
  }
}
0 голосов
/ 15 января 2019

Да, на самом деле это ожидаемое поведение.

Основная цель ask - создать фиктивный ActorRef, который не использует столько ресурсов, сколько полностью укомплектованный актер, чтобы выступать в роли отправителя, на которого вы можете ответить.

Оборачивает обещание, которое завершается только при получении сообщения и возвращении будущего из функции ask.

Итак, хотя вы технически запрашиваете у Actor1, отправитель () в Actor2 будет фиктивным PromiseActor, который создает запрос, поэтому вы не получаете Message2 от Actor2.

...