使用Akka Supervision

时间:2019-01-18 00:10:19

标签: scala akka

这里有些东西卡住了。我有一个创建Actor A和B的SupervisorActor,依此类推。没有ActorA或ActorB的子actor。让我们说Actor A和B都命中数据库并获得SQL异常。这将传播到整个链的SupervisorActor。当我捕获SQL异常时,我还需要记录Actor A有一个SQL异常。但是我该如何实现呢?

  • 我认为是演员A记录的一种方式,并在调用堆栈上方引发异常。但是我的代码中需要一个try-catch块。哪一种在这里失败了。 创建
  • 我可以想到的另一种方式是,演员A和演员B创建一个新的子演员Actor A1,将其发送到链上,但这不是选项,因为它是没有演员的常见库。

有没有办法实现类似于以下内容的方法: 是!我想知道我们是否可以实现以下目标:

 try{
    saveUser()
  }
  catch {
    case b: BatchUpdateException =>     
        logger.error("We received a BatchUpdateException when trying to save the user")
        throw b
      }
    case e: Exception =>
      logger.error("Some other exception occured ")
      throw e
  }



try{
    saveSeller()
  }
  catch {
    case b: BatchUpdateException =>     
        logger.error("We received a BatchUpdateException when trying to save the Seller details")
        throw b
      }
    case e: Exception =>
      logger.error("Some other exception occured ")
      throw e
  }

PS:我不确定监管策略是否是实现我要达到的目标的正确方法。我正在尝试探索新的可能性。

1 个答案:

答案 0 :(得分:0)

使用SupervisorStrategy集中管理者参与者内部的错误处理逻辑是比在各个参与者之间分散/复制错误管理逻辑更好的方法。特别是,将Exception处理逻辑表示为类型decider的{​​{1}}参数有助于提高代码的可维护性。

  

当我捕获SQL异常时,我还需要记录Actor A有一个SQL异常。但是我该如何实现呢?

在主管演员中,您始终可以通过PartialFunction[Throwable, Directive]包括相应的演员引用,来记录主管演员中各个子演员的Exception。以下是管理人员角色的简单示例,它记录了几个孩子角色中特定于角色的sender,并采取了相应的Exception动作:

Resume/Stop/Escalate