Актеры Scala Akka - получение состояния актера - PullRequest
0 голосов
/ 20 ноября 2018

Метод receive определяет поведение актера в актерах Akka.Я ищу подход, который может дать мне все различные сообщения (и их типы), которые субъект может обрабатывать предпочтительно во время выполнения в Scala.

1 Ответ

0 голосов
/ 21 ноября 2018

Прямой ответ

К сожалению, запрашиваемая вами функция недоступна с akka.Метод receive определяется как :

type Receive = PartialFunction[Any, Unit]

abstract def receive : Actor.Receive

У PartialFunction нет способа перечислить все типы, которые он может обработать.Кроме того, после создания экземпляра Actor в ActorRef у вас нет доступа к базовому методу receive.

Одной из альтернатив является определение вашего получения вне реализации Actor изатем используйте isDefinedAt метод PartialFunction для проверки определенного значения:

object MyActor {
  val myPartial : Receive = {
    //receive functionality
  }
}

class MyActor extends Actor {
  override def receive : Receive = MyActor.myPartial
}

//test if a value can be processed by MyActor

val testValue = 42

val testValueIsDefined = MyActor.myPartial.isDefinedAt(testValue)

Косвенный ответ

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

Я обнаружил, что хорошей практикой является строго объявлять, какие типы входов может получать актер:

sealed trait MyActorInputs

case class Foo(value : Int) extends MyActorInputs
case class Bar(value : String) extends MyActorInputs

object MyActor {
  val processInput : MyActorInput => Unit = ???
}

class MyActor extends Actor {
  override def receive : Receive = {
    case input : MyActorInput => 
      MyActor.processInput(input)
    case unknown => 
      System.error.println(s"MyActor received unknown input: $unknown")
  }
}

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

...