Прямой ответ
К сожалению, запрашиваемая вами функция недоступна с 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")
}
}
Эта техника необеспечить проверку времени компиляции или строгие гарантии, но если вы примените его ко всем вашим актерам, это облегчает жизнь большим проектам.Это также позволит вам использовать отражение для динамического получения списка доступных типов ввода .