scala - 应该如何创建一个可能抛出异常的 akka actor?

标签 scala akka actor

我正在将一个项目从 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 调用实际上并没有创建 MyActor 对象本身,而是将其推迟到另一个线程。因此,当构造函数抛出异常时,我放入的 try/catch block 不起作用。

如何将此 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)
  }
}

关于scala - 应该如何创建一个可能抛出异常的 akka actor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18648390/

相关文章:

scala - 如何更改 SBT 放置测试资源的目录?

apache-flex - 使用 BlazeDS 在 Scala 和 Flex 之间传递案例类

java - AKKA 需要在 kubernetes 服务中进行端口转发

scala - Actors 中 future 的执行上下文

swift - 何时将非隔离与参与者的存储属性一起使用?

android - 从屏幕触摸中过滤 Actor 触摸

scala - Scala 中的任何东西都等同于 C#'s ` dynamic`?

scala - 通用优先级队列中的协变和逆变类型

scala - 如何从 Akka HTTP POST 请求中读取 JSON 正文并将最终响应作为 JSON 数组发送

scala - 使用 sbt 和 Akka 微内核运行应用程序