0

こんにちは、親アクターに監視を適用しましたが、子は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 に答える