1

我有两个演员,一个是父母,一个是孩子,孩子演员负责根据给定的ID从MongoDB中获取数据并将数据回复给调用演员,在我的情况下是父母,现在我想在我的孩子演员我知道如何执行监督策略,但是如何在我的代码中做到这一点让我感到困惑应用程序,y 监督,因为我不知道我的代码将来会抛出什么异常这是我的代码,请帮助我 ReadOnlyAdminQueryActor.scala(Patent Actor)

class ReadOnlyAdminQueryActor extends Actor{

val log = LoggerFactory.getLogger("controller")
     case ReadOnlyAdminReadByID(idList)=>
          var RetunedLists = new MutableList[ReadOnlyAdmin]()
          RetunedLists=  readById(idList)
          sender ! RetunedLists //return list of ReadOnlyAdmin objects to the calling actor (matched uuid results)
   def readById(idList:MutableList[Int]):MutableList[ReadOnlyAdmin]= {
    var connection=MongoFactory.getConnection
    var collection=MongoFactory.getCollection(connection, "readOnlyAdmin")

   var RetunedList = new MutableList[ReadOnlyAdmin]()

    var id:Int=0
    var email:String=""
    var SecondryEmail:Option[String]=None
    var FirstName:String=""
    var LastName:String=""
    var userStatus:String=""

  log.info("readOnlyAdmin query class data method readByID")

 for(Id<-idList){

    val q=QueryBuilder.start("_id").is(Id)

    val cursor=collection.find(q.get)
    var obj=new BasicDBObject

 try {
     while(cursor.hasNext)
     {
       obj=cursor.next().asInstanceOf[BasicDBObject]

       id=obj.getString("_id").toInt
       email=obj.getString("Email")
       SecondryEmail=Option(obj.getString("SecondryEmail"))
       FirstName=obj.getString("FirstName")
       LastName=obj.getString("LastName")
       userStatus=obj.getString("UserStatus")

       val readOnlyAdmin=new ReadOnlyAdmin(id,FirstName, LastName, email, SecondryEmail ,"",UserStatus.withName(userStatus))
       RetunedList+=readOnlyAdmin  //adding objects in a list


     }//end of while
   }//end of try
    catch
    {
      case e: Exception => log.error("printStackTrace"+e.printStackTrace)

    }
   finally{
     cursor.close()
     MongoFactory.closeConnection(connection)

   }
 }//end for loop

    RetunedList
 }
}

ReadOnlyAdminReadMongoActor.scala(儿童演员)

    class ReadOnlyAdminReadMongoActor extends Actor{
      val log = LoggerFactory.getLogger("controller")
      val ReadOnlyAdminQueryActor=context.actorOf(Props[ReadOnlyAdminQueryActor].withDispatcher("akka.actor.readOnlyAdminReadMongoActor-dispatcher"), name = "ReadOnlyAdminQueryActor")

    case ReadOnlyAdminReadFromMongoById(readOnlyAdmin,idList)=>
            var RetunedLists = new MutableList[ReadOnlyAdmin]()
            implicit val timeout = Timeout(10 seconds)//wait for 10 seconds 
override val supervisorStrategy: SupervisorStrategy = {
    OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 10 seconds) {
      case x: Exception => ???
    }
  }

             val future:Future[MutableList[ReadOnlyAdmin]] = ask(ReadOnlyAdminQueryActor,ReadOnlyAdminReadByID(idList)).mapTo[MutableList[ReadOnlyAdmin]] 
             future.onComplete { 
              case Success(result)=>
                RetunedLists=result
                      for(a<-RetunedLists)
                      {
                           log.info ("id is "+a.getUuid+"First name is "+a.getFirstName
                          +"Last name is "+a.getLastName+"Email is "+a.getEmail 
                          +"secondry email is "+a.getSecondryEmail+"user status is "+a.getUserStatus)
            }

             case Failure(e)=>
             log.error(" in failure")
             log.error("printStackTrace"+e.printStackTrace)
    }

object Test extends App{
 val system = ActorSystem("TestSystem")
val readOnlyAdmin= new ReadOnlyAdmin
var uuidsList = new MutableList[Int]()
uuidsList+=123
val ReadOnlyAdminReadMongoActor=system.actorOf(Props[ReadOnlyAdminReadMongoActor].withDispatcher("akka.actor.readOnlyAdminReadMongoActor-dispatcher"), name = "ReadOnlyAdminReadMongoActor")
ReadOnlyAdminReadMongoActor ! ReadOnlyAdminReadFromMongoById(readOnlyAdmin,uuidsList)       

}

我如何以正确的方式执行监督,以及如何知道在我的子actor中会抛出哪个异常 幸运的是,Java 库明确说明它们将要抛出什么,而 Scala 库几乎总是抛出很少或不抛出即使在 IDE 中,当我们将鼠标悬停在代码上时也不会显示任何信息,请帮助我提前感谢

4

1 回答 1

1

主管策略属于父级,而不是子级。孩子应该抛出它的异常,而父母决定如何处理失败。在下面的代码中,Child Actor 将重新启动 3 次,然后终止:

class Parent extends Actor {

    override def preStart(): Unit = {
      self ! "Start Child"
    }

   def receive = {
     case "Start Child" => context.actorOf(Props[Child])
   }

  override def supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 3) {
    case ex: Throwable => Restart
  }
}

class Child extends Actor {

  override def preStart() = {
    self ! "Throw"
  }

  def receive = {
    case "Throw" => throw new Exception("Throwing")
  }
}
于 2015-08-18T15:09:38.910 回答