首页 > 解决方案 > 寻找允许类产生演员的抽象

问题描述

我有一门课,为Source它的客户提供不同种类的 s。当 aSource运行时,应该生成一个将新条目馈送到相应流中的参与者。所以我的班级需要能够产生演员。我知道有两种方法可以做到这一点:使用ActorContext另一个演员的或使用ActorSystem. 产生新演员的能力是否有一个共同的抽象,所以我可以在我的类中注入一个帮助器,只允许它在需要时产生演员,而不管它是如何完成的?

ActorSpawner为此目的创建了一个界面,到目前为止它运行良好:

trait ActorSpawner {

  def spawn[T](behavior: Behavior[T]): ActorRef[T]

  def spawn[T](behavior: Behavior[T], name: String): ActorRef[T]

} 

但是,自从我升级到 Akka 2.6 后,我经常收到以下错误消息:

错误 akka.actor.SupervisorStrategy - 不支持从 Actor[akka://...] 外部访问 ActorContext。Actor 当前没有处理任何消息,但是 ActorContext 是从 Thread[...] 调用的

在升级之前这似乎不是问题,但现在我想知道我所做的是否是可取的,或者这是否是一种反模式。

标签: scalaakkaakka-typed

解决方案


我知道有两种方法可以做到这一点:使用另一个演员的 ActorContext 或使用 ActorSystem

我认为这对于经典(即无类型)Actor API 来说是正确的,常见的抽象是两者akka.actor.ActorRefFactory兼而有之。这就是创造新演员的地方。akka.actor.ActorSystemakka.actor.ActorContextdef actorOf(props: Props): ActorRef

在新的类型化 Actor API 中,情况不再如此。您不能从 中创建一个actor akka.actor.typed.ActorSystem,您只能akka.actor.typed.scaladsl/javadsl.ActorContext使用spawn*一系列方法创建它,给定actor系统的监护人/根actor除外,您可以ActorSystem(guardianBehavior: Behavior[T], name: String)在Scala中由和朋友创建它,或者ActorSystem.create(...)在Java中使用等效的方法创建它。

ActorContext只能从欠它的参与​​者的消息处理线程或方法访问setup,并且生成错误日志的运行时检查自2.6.6. 您可能从其他地方调用该对象。也许这篇文章将有助于跟踪确切的位置:https ://discuss.lightbend.com/t/akka-2-6-6-context-log-error-string-failed/6708/2


推荐阅读