Акка, Общий ActorRef? - PullRequest
       8

Акка, Общий ActorRef?

0 голосов
/ 04 февраля 2019

Я довольно новичок в Scala, так что это может быть тривиальным вопросом.Я пытаюсь собрать простой проект в Akka, и я не уверен, как справиться с ситуацией, когда мне нужно сохранить ссылку на актера ограниченного типа.Давайте предположим, что у меня есть черта актера

trait MyActorTrait extends Actor

Затем в другом месте я бы хотел определить другую черту с членом

def reference: ActorRef[MyActorTrait]

Это, очевидно, не работает, так как ActorRef это не волнуето типе целевого актера (или нет?).Есть ли способ ограничить reference приемом ссылок только на актеров, которые расширяют MyActorTrait?

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

То, как вы пытаетесь ссылаться на актера в другом актере, неверно.Актеры образуют иерархию.Таким образом, это дает вам путь для ссылки на актера.Есть в основном три способа, которыми вы могли бы ссылаться на другого актера, используя

  • Абсолютные пути
 context.actorSelection("/user/serviceA")
  • Относительные пути
context.actorSelection("../brother") ! msg
  • Запрос иерархии логических акторов
context.actorSelection("../*") ! msg

Вы можете взглянуть на документ - https://doc.akka.io/docs/akka/2.5/general/addressing.html.

0 голосов
/ 04 февраля 2019

После некоторого копания я думаю, что нашел способ.Сначала я создаю черту, которая сохранит тип актера

trait TypedActorRef[T <: Actor] {
  def reference: ActorRef
  type t = T
}

Затем реализую универсальное приложение, которое создает частный класс case, расширяющий черту

object TypedActorRef {
  private case class Ref[T <: Actor] (reference: ActorRef) extends TypedActorRef[T]
  def apply[T <: Actor](actor: T) = {
    Ref[T](actor.self)
  }
}

С этим я могу сохранить ссылкукоторый ограничен актером типа, который я хочу.

trait OtherActor extends Actor

trait MyActor extends Actor
{
  def otherActorsReference: TypedActorRef[OtherActor]
}

Мне кажется, это нормально, по крайней мере, это не расстраивает компилятор, но я не уверен, мешает ли это решение создавать другие расширенияTypedActorRef, который может не соответствовать тем же ограничениям.

0 голосов
/ 04 февраля 2019

По замыслу, вы не можете получить доступ к базовым Actor через ActorRef (или, в значительной степени, любым другим способом).Таким образом, ограничивать тип, который вы описываете, бессмысленно, не было бы абсолютно никакой разницы в том, что вы можете сделать с ActorRef[Foo] против ActorRef[Bar].

Не говоря уже о том, что это хорошо (мало что в Акке можно охарактеризовать таким образом, ММО), но это так.

...