Отправка + обработка нескольких сообщений с актерами - PullRequest
2 голосов
/ 27 января 2012

При работе с актерами, если актору необходимо сотрудничать с несколькими другими субъектами для выполнения запроса, то какой здесь рекомендуемый подход?Чтобы быть более точным, если субъекту A (посредством обработки сообщения M) необходимо получить информацию от субъекта B + субъекта C, он может асинхронно отправлять сообщения субъекту B + C, но как он должен соотносить ответы от субъекта B + C кисходное сообщение M?

Я посмотрел на инфраструктуру Akka и не вижу, как это делается, поэтому мне пришлось самому что-то реализовывать, в результате чего актер отслеживает, какие сообщения были отправлены, и пытается соотнестиих ответы возвращаются к исходному сообщению.Должно быть, я что-то упустил, так как думал, что этот тип поведения уже встроен в различные среды Actor

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Как правило, если вам нужно отправить сообщение и получить коррелированный ответ, вам в конечном итоге придется отправить какой-то одноразовый номер в исходном сообщении, которое ответчик должен вернуть с ответом. Это может быть явным или может поддерживаться на уровне обмена сообщениями. Не уверен насчет Акки, но именно так Эрланг обрабатывает RPC в OTP.

1 голос
/ 27 января 2012

Просто создайте нового актера и используйте его, чтобы сохранить контекст и остановить его после истечения времени ожидания или после выполнения «соединения». Вы также можете использовать Future-состав вместо порождения актера:

class A extends Actor {
  def receive = {
    case DoX(x) =>
      val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
      val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
      b zip c map { case (b,c) => merge(b,c) } pipeTo sender
    }
  }
}

Или поток данных:

class A extends Actor {
  def receive = {
    case DoX(x) => flow {
      val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
      val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
      merge(b(),c())
      } pipeTo sender
    }
  }
}
...