Scala 作为演员 - 获取演员的状态
Scala Akka actors - getting the state of an actor
receive
方法定义了 Akka actors 中的 actor 行为。我正在寻找一种方法,它可以为我提供演员可以在运行时在 Scala 中处理的所有不同消息(及其类型)。
直接回答
很遗憾,akka
不提供您要求的功能。 receive
方法 is defined as:
type Receive = PartialFunction[Any, Unit]
abstract def receive : Actor.Receive
PartialFunction
无法枚举它可以处理的所有类型。此外,一旦 Actor
被实例化为 ActorRef
,您就无法访问底层的 receive
方法。
一种替代方法是在 Actor
实现之外定义接收,然后使用 isDefinedAt
method of 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)
间接回答
如果你正确地组织了你的代码,那么你的问题的基础就变得不必要了。
我发现一个好的做法是严格声明 Actor 可以接收的输入类型:
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")
}
}
此技术不提供编译器时间检查或严格保证,但如果您在所有 Actors 中采用它,那么它往往会使大型项目的工作变得更轻松。它还可以让您 .
receive
方法定义了 Akka actors 中的 actor 行为。我正在寻找一种方法,它可以为我提供演员可以在运行时在 Scala 中处理的所有不同消息(及其类型)。
直接回答
很遗憾,akka
不提供您要求的功能。 receive
方法 is defined as:
type Receive = PartialFunction[Any, Unit]
abstract def receive : Actor.Receive
PartialFunction
无法枚举它可以处理的所有类型。此外,一旦 Actor
被实例化为 ActorRef
,您就无法访问底层的 receive
方法。
一种替代方法是在 Actor
实现之外定义接收,然后使用 isDefinedAt
method of 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)
间接回答
如果你正确地组织了你的代码,那么你的问题的基础就变得不必要了。
我发现一个好的做法是严格声明 Actor 可以接收的输入类型:
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")
}
}
此技术不提供编译器时间检查或严格保证,但如果您在所有 Actors 中采用它,那么它往往会使大型项目的工作变得更轻松。它还可以让您