Запрос-ответ с шаблоном запроса - PullRequest
0 голосов
/ 09 марта 2020

Я довольно новичок в Akka и прошел этот пример запроса-ответа документации Akka.

Я понял, что этот шаблон работает следующим образом:

  1. Dave запрашивает Hal, отправляя сообщение с протоколом Hal.
  2. Hal отвечает, отправляя сообщение своего протокола на Dave.
  3. Dave, который не знает, что протокол Hal получает адаптированный ответ и отправляет его сам себе.
  4. Dave получает адаптированный ответ и продолжает свою полезную нагрузку.
context.ask(dave, Dave.Request) {
  case Failure(exception) => throw exception
  case Success(response) => AdaptedResponse(response.payload)
}

Но что произойдет, если Dave нужно response.payload прямо на месте? Это вообще возможно?

1 Ответ

0 голосов
/ 10 марта 2020

В Akka Typed это невозможно с использованием context.ask, хотя я хотел бы спросить, зачем вам это нужно.

В качестве альтернативы, когда у вас есть два действующих лица, которые взаимодействуют, вы можете определить совместный протокол между ними:

object Hal {
  sealed trait Command

  sealed trait CommandFromDave extends Command {
    def replyTo: ActorRef[Dave.ResponseFromHal]
  }

  case class OpenThePodBayDoorsPlease(override val replyTo: ActorRef[Dave.ResponseFromHal]) extends CommandFromDave
}

object Dave {
  sealed trait Command

  sealed trait ResponseFromHal extends Command

  case class MessageFromHal(msg: String) extends ResponseFromHal
}

Тогда Dave может просто

hal ! Hal.CommandFromDave(context.self)

и получить ответ непосредственно от Hal (и вы можете запланировать сообщение для себя, чтобы учесть время ожидания ).

Обратите внимание, что это действительно запутывает двух актеров вместе. Это подходит для случаев, когда родительский актер откладывает долгосрочную задачу на дочернего актера, но это действительно сомнительный подход в большинстве / всех других сценариях ios.

...