scala - 寻找允许类产生演员的抽象
问题描述
我有一门课,为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[...] 调用的
在升级之前这似乎不是问题,但现在我想知道我所做的是否是可取的,或者这是否是一种反模式。
解决方案
我知道有两种方法可以做到这一点:使用另一个演员的 ActorContext 或使用 ActorSystem
我认为这对于经典(即无类型)Actor API 来说是正确的,常见的抽象是两者akka.actor.ActorRefFactory
兼而有之。这就是创造新演员的地方。akka.actor.ActorSystem
akka.actor.ActorContext
def 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
推荐阅读
- swift - Swift 将数据写入 Firebase 错误预期声明
- django-models - Django - Save an object's m2m relationships to another object
- reactjs - 使用导入的函数时,流不会推断类型细化
- python - 将数据类型“object”转换为“Float”
- c# - 当动态代理实体类型用作目标对象时,Audit.net 似乎挂起
- mysql - HiveQL 按列值的子字符串分组并识别缺失的组
- python - 元字符和反斜杠在这里做什么?
- react-native - TypeError: undefined is not a function (near '...this.state.categories.map...')
- assembly - 如何从 main() 返回大于 8 位的数字?
- sql - 按模糊条件分组