Будущее [Источник] труба Актеру - PullRequest
0 голосов
/ 11 мая 2018

Есть два местных актера (удаленное взаимодействие не используется). Актеры были упрощены для примера:

class ProcessorActor extends Actor {
  override def receive: Receive = {
    case src:Source[Int, NotUsed] =>
      //TODO processing of `src` here
  }
}

class FrontendActor extends Actor {
  val processor = context.system.actorOf(Props[ProcessorActor])
  ...

  override def receive: Receive = {
    case "Hello" =>
      val f:Future[Source[Int, NotUsed]] = Future (Source(1 to 100))

      f pipeTo processor
  }
}

// entry point:
val frontend = system.actorOf(Props[FrontendActor])
frontend ! "Hello"

Таким образом, FrontendActor отправляет Source на ProcessorActor. В приведенном выше примере это работает успешно.

С таким подходом все в порядке?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Таким образом, FrontendActor отправляет Source на ProcessorActor. В приведенном выше примере это работает успешно.

С таким подходом все в порядке?

Непонятно, что вас беспокоит.

Отправка Source от одного актера к другому актеру на той же JVM - это нормально. Поскольку межакторное взаимодействие в той же JVM, как указано в документации , "просто осуществляется через передачу ссылок", в вашем примере 1 нет ничего необычного. По сути, происходит то, что ссылка на Source передается на ProcessorActor после завершения Future. Source - это объект, который определяет часть потока; вы можете отправить Source от одного актера другому актеру локально так же, как вы можете любой объект JVM.

(Однако, когда вы пересекаете границу одной JVM, вам приходится иметь дело с сериализацией.)


1 Незначительное тангенциальное наблюдение: FrontendActor вызывает context.system.actorOf(Props[ProcessorActor]), что создает актера высшего уровня. Как правило, актеры высшего уровня создаются в основной программе, а не в актере.

0 голосов
/ 11 мая 2018

Да, это нормально, но не совсем так, как вы это описываете. FrontendActor не отправляет Future[Source], просто отправляет Source.

Из документов:

pipeTo устанавливает в будущем обработчик onComplete, чтобы повлиять на представление результата другому субъекту.

Другими словами, pipeTo означает «отправить результат этого Future актеру, когда он станет доступным».

Обратите внимание, что это будет работать, даже если используется удаленное взаимодействие, поскольку Future разрешается локально и не передается по проводной связи удаленному субъекту.

...