Есть ли способ получить предсказуемое имя актера с помощью Akka-Stream?

Я использую ActorPublisher в качестве Akka-Stream Source. Я не могу понять, как предсказуемо назвать актера ввода, чтобы я мог отправлять ему сообщения из других частей моего приложения. Я создаю свой источник следующим образом:

val src = Source[Task](Props(classOf[TaskListener], this), "task-listener")

Я получаю ActorRef, когда материализую поток, но путь для него генерируется динамически, и он использует предоставленное мной имя только как часть сгенерированной кодом схемы именования, ориентированной на поток.

Есть ли способ, чтобы этот внешний источник актера имел явное имя, или я застрял, передавая ActorRef?

Если я не могу указать это явно, значит ли это, что вы не можете использовать Akka-Stream напрямую с удаленным взаимодействием?

EDIT: Теперь я могу найти своего актера, используя относительный путь, но мне все еще нужно выяснить, как назвать мой Flow, чтобы я мог понять, каким будет полный путь к рассматриваемому актеру.

EDIT: (информация о версии akka ниже, scala 2.11.6)

"com.typesafe.akka" %% "akka-actor" % "2.3.9"
"com.typesafe.akka" %% "akka-stream-experimental" % "1.0-M4"

РЕДАКТИРОВАТЬ: Дружелюбные люди из группы akka-user google просветили меня и предложили правильный способ справиться с этим, передавая ActorRef, который является результатом самого вызова runWith(), а не используя .actorSelection(). Я обновлю этот вопрос, если обнаружу, что это положение вещей изменится в будущем. Спасибо за чтение.


person Rich Henry    schedule 06.04.2015    source источник
comment
Я понимаю, что прошло более 3 лет, но не могли бы вы, наконец, поделиться тем, как вы справились с этим, потому что я борюсь с точно такой же задачей.   -  person YoZH    schedule 12.05.2018
comment
@YoZH Я создал Source, используя Source.actorPublisher, затем создал Flow, на котором я вызвал flow.runWith(src), но с тех пор этот метод устарел. Надеюсь, вы уже разобрались с проблемой.   -  person Rich Henry    schedule 27.08.2018


Ответы (1)


Хорошим способом решить эту проблему будет добавление группового маршрутизатора с определенным путем, после чего вы можете указать маршрутизатору, где он может найти вас (маршрутизаторы).

Сделав это, вы отделите свою конкретную группу акторов и сохраните единую точку входа в свой исходный пул через маршрутизатор. Также вы сможете сделать этот кластер маршрутизатора осведомленным в будущем.

Вы также можете заглянуть в ActorFlowMaterializer — http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer. Вы можете найти этот комментарий в исходном коде:

/** The `namePrefix` is used as the first part of the names of the actors running
  * the processing steps. The default `namePrefix` is `"flow"`. The actor names are built up of
  * `namePrefix-flowNumber-flowStepNumber-stepName`.
  */
def create(settings: ActorFlowMaterializerSettings, context: ActorRefFactory, namePrefix: String): ActorFlowMaterializer =
apply(Option(settings), Option(namePrefix))(context)
person YoK    schedule 07.04.2015
comment
Это хороший способ абстрагировать актеров, но мне нужно иметь возможность разрешать актеров из пути. Для этой цели ваше решение ничем не отличается от совместного использования ActorRef. Но хорошее мышление, несмотря ни на что. - person Rich Henry; 07.04.2015
comment
Другим решением может быть отправка сообщения «Идентификация» актерам под вашим «ActorSelection» и прослушивание ответа «ActorIdentity», который будет содержать «ActorRef». Вы также можете создать собственное сообщение, если хотите. Насколько я помню, Flow будет иметь ваше имя с префиксом, например, task-listener*. - person YoK; 07.04.2015
comment
Также об именовании, если вы используете ActorFlowMaterializer, вы можете видеть, как называются актеры, и вы управляете префиксом этих актеров, предоставляя свой собственный префикс самому Materializer. Дополнительную информацию см. здесь: http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer. - person YoK; 07.04.2015
comment
Имена актеров состоят из * namePrefix-flowNumber-flowStepNumber-stepName. - person YoK; 07.04.2015
comment
Я пошел по маршруту Materializer, в результате чего он не влияет на имя супервизора верхнего уровня, а только на префикс динамически создаваемых акторов. YoK, в вашем примере все еще будет $a или что-то подобное над этим актером с динамическим именем. - person Rich Henry; 07.04.2015
comment
@YoK, не могли бы вы помочь мне понять, что такое namePrefix-flowNumber-flowStepNumber-stepName на каком-нибудь примере? - person beinghuman; 08.03.2020