我正在将一个项目从 scala Actor 迁移到 Akka Actor。我曾经有过类似的情况,如果某个系统资源不可用,MyActor 的构造函数可能会抛出异常:
var myActor: MyActor = null
try {
myActor = new MyActor(3)
}
catch {
case e: SomeUserDefinedException => println("failed!")
}
使用 akka,我将代码迁移到此:
val someParam = 3
var myActor: ActorRef = null
try {
myActor = context.actorOf(Props(classOf[MyActor], someParam), "myActor")
}
catch {
case e: SomeUserDefinedException => println("failed!")
}
我遇到的问题是,在 akka 的情况下,context.actorOf
call 实际上并不创建 MyActor 对象本身,而是将其推迟到另一个线程。所以当构造函数抛出异常时,try
/catch
我放入的块没有效果。
如何将此 scala actor 代码迁移到 akka actor 中?理想情况下,我宁愿避免增加很多额外的复杂性。
您可以在构造函数中捕获异常MyActor
并将此异常通知其他参与者(例如家长)。尝试这个:
class MyActor(val parent: ActorRef) extends Actor {
try{
throw new RuntimeException("failed construct")
} catch {
case e: Throwable =>
parent ! e
throw e
}
def receive: Actor.Receive = {case _ => }
}
class ParentActor extends Actor {
val child = context.actorOf(Props(classOf[MyActor], self), "child")
override def receive = {
case e: Throwable => println(e)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)