【发布时间】:2019-04-23 08:58:41
【问题描述】:
receive 方法定义了 Akka Actor 中的 Actor 行为。我正在寻找一种方法,它可以为我提供演员可以在运行时在 Scala 中更好地处理的所有不同消息(及其类型)。
【问题讨论】:
-
这是不可能的。如果你需要这样的保证,你可能想看看 akka-typed。
-
Akka typed 无法给出能够处理的消息的“类型”。 Scala 不是依赖类型语言,所以类型不是一等的。但是,Akka 类型 can 强制只有某些消息才能由某个“actor”处理。
-
不,没有。
receive方法被传递一个PartialFunction[Any, Unit]。在 akka typed 中,您必须指定可以处理的消息类型。 -
还要注意,通过使用
context.become,演员可以动态地改变其行为(如果演员没有context.becomed,receive方法只是默认的)。跨度> -
运行中的actor的行为被存储为一个私有字段(
ActorCell中的behaviorStack)。如果您可以访问该字段,则可以直接获取当前行为,即PartialFunction[Any, Unit]。从那里,您可以将消息传递给isDefinedAt方法。这将做的最多的是让你有一个演员在那个时刻可以处理的消息列表,这不是你想要的,但这没关系,因为除非有一个主要的 JVM 漏洞利用,你是不会访问该私有字段。