在 Akka (scala) 中是否有任何类型检查 ActorRef
的模式?当我将引用传递给另一个 Actor 时,我想确保它是正确的类型。但是,当使用 Actor 的 context
获取引用时,它总是返回 ActorRef
,因此我无法真正使用子类来检查这一点。
下面是一个具体的例子。在 Akka 中,我通过将 ActorRef
传递给另一个 Actor
的构造函数来注入(inject)依赖项。请看下面的人为示例: Speaker
是使用对 Listener
的引用构造的。正如 Akka 文档所鼓励的那样,我在伴随对象中创建了一个 props 构造函数。
package test
import akka.actor._
object scratchpad {
object Speaker {
def apply(listener : ActorRef) : Props = Props(classOf[Speaker],listener)
}
class Speaker private(listener : ActorRef) extends Actor {
override def preStart() = listener ! "knock knock"
}
class Listener extends Actor {
def receive : Receive = {
case "knock knock" =>
//received message
}
}
val system = ActorSystem("test")
val listener = system.actorOf(Props[Listener])
val speaker = system.actorOf(Speaker(listener))
}
问题是我可以创建另一个角色,比如
DeafMute
,然后将其传入 - 但编译器不会捕获它,因为它也是 ActorRef
类型。有解决这个问题的模式吗? 最佳答案
有一些可能性。
对于一种情况,您无法将监听器传递给构造函数,而是使用 ActorSelection 来查找它。为此,您需要知道路径,但这可能会很棘手,具体取决于您的 Actor 层次结构。我没有经常使用它,但是由于查找是异步的,我希望您需要跳过一些箍以避免计时问题并在尚未初始化时获取消息。另外我认为这可能是单元测试中的麻烦。
我在我的一个项目中使用的另一种方法是创建一个工厂,该工厂将根据我想要的 Actor 类型返回 actorrefs。但是,当您考虑 Actor 层次结构和临时 Actor 时,这可能会变得困惑。这个工厂使用依赖注入(inject)来创建角色并在内部存储它们以允许查找。在我们的用例中运行良好,非常适合单元测试,因为您可以模拟工厂并让它轻松返回 testProbes。不过,这需要一些工作来实现,您需要 IndirectActorProducer 和其他一些东西才能使其工作。
除此之外,问题是这是否真的是一个问题。通常你会有“管道”,即连接 Actor ,集中,例如在层次结构的父节点中。如果您以错误的方式连接 Actor ,您的测试应该捕获它,您也可以激活未处理消息的日志记录。需要一些时间来适应它,但没有检查连接正确的 Actor 并没有那么糟糕,你只需要纪律和一套好的测试。它类似于静态与动态类型的争论。
关于scala - 注入(inject)依赖项时如何检查 Actor/ActorRef 的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22808176/