0

嗨,我已经对 Parent actor 应用了监督,而孩子是 Throwing MongoTimeOutException(我故意提出该异常以进行测试),但在监督中调用了默认情况。

这是代码:

class child extends Actor {
 def receive = {
  case insertData(data) => 
     //insertion code ,MongoTimeOutException is raised i have killed the service intentionally 
 }
}

class parent extends Actor {

val child=context.actorOf.....//actor creation code

override val supervisorStrategy = OneForOneStrategy(
                                    maxNrOfRetries = 10, withinTimeRange = 10 seconds) {
    case _:MongoException=>
      log.error("Got some MongosException, Supervision Strategy says Resume")  
      Resume
    case _:ElasticsearchTimeoutException=>
      log.error("Got some ElasticsearchTimeoutException, Supervision Strategy says Resume")  
      Resume
    case _:ElasticsearchException=>
      log.error("Got some ElasticsearchException, Supervision Strategy says Resume")  
      Resume
    case _ => 
      log.error("Got some Exception, Supervision Strategy says Resume")
      Resume
  }

 def receive = {
  case Msg(data) => 
     child ! insertData(data)
 }
}

object test extends App
{
 val parent = system.actorof....//actor creation code
 parent !Msg(data)
}

当我运行此代码时,确实会发生 MongoTimeOutException,但这种情况在监督中被调用。

case _ => 
      log.error("Got some Exception, Supervision Strategy says Resume")
      Resume

为什么呢?据我说,它应该援引这种情况:

case _:MongoException=>
  log.error("Got some MongosException, Supervision Strategy says Resume")  

难道我做错了什么?

请帮我 。

4

1 回答 1

0

打印默认案例值的类,看看什么是真正的异常,以便您处理它。

这是你的代码

case _ => 
      log.error("Got some Exception, Supervision Strategy says Resume")
      Resume

这是你必须做的(打印异常类)

case ex =>
     log.error(s"Exception $ex of type ${ex.getClass}.Got some Exception, Supervision Strategy says Resume", ex)
    Resume

上面的代码将帮助您了解无法捕获的确切消息是什么。

于 2016-10-27T12:53:18.317 回答