[英]implicit Akka system in Scala trait
如何使我的ActorSystem在ServiceA
和ServiceB
可用,这是我试图开始工作的代码。 它可以编译,但是我在Tcp中得到了隐式系统的空指针异常。
为什么我会得到一个nullpointer异常,该如何更改才能使系统进入特征服务? 为什么要编译?
trait ServiceA {
implicit val system: ActorSystem
}
trait ServiceB {
implicit val system: ActorSystem
Tcp().outgo... // Code compile but i get nullpointer exception
}
object Main extends App with ServiceA with ServiceB {
override implicit val system: ActorSystem = ActorSystem("MySys")
}
SystemA
和SystemB
(使用system
)的构造函数在Main
构造函数(包括system
初始化)之前执行。 在Main
使用implicit lazy val system = ...
(允许以这种方式实现抽象val
),此问题应得到解决。
作为@alexei_romanov回答的补充。 您想通过将Tcp...
call放入特征主体而不将其分配给val
或def
什么? 现在,这只是在Main
初始化期间的某个时刻执行的动作。 由于它是对尚未初始化的对象的操作,因此它可能会导致未定义的行为。
这是由特征初始化顺序引起的,确实不幸的是类型系统无法对此进行防御。
解决此问题的一种方法是将ActorSystem初始化置于其自身的特征中,并确保首先将其混入,因此:
trait ServiceA {
implicit val system: ActorSystem
}
trait ServiceB {
implicit val system: ActorSystem
Tcp().outgo... // Code compile but i get nullpointer exception
}
trait ActorSystemInitialization {
val system: ActorSystem = ActorSystem("MySys")
}
object Main extends App with ActorSystemInitialization with ServiceA with ServiceB {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.