у меня есть код, в котором я проверяю, не существует ли актер уже, мы создадим его, но проблема в том, что мой код использует будущие обратные вызовы OnComplete, и я делаю это в функции/def, и я просто хочу вернуть ActorRef вот мой код
def getRegularAdminIndexMongoActor():ActorRef= {
var actorRef:ActorRef=null
val sel = actorSystem.actorSelection("akka://ActorSystem/user/RegularAdminIndexMongoActor");
val future:Future[ActorRef] = sel.resolveOne().mapTo[ActorRef]
future.onComplete {
case Success(result)=>
if(result != null){
log.info("actor exists" + result)
}
actorRef=result
actorRef
case Failure(e)=>
log.warn("in failure block actor does not exists" + e)
val regularAdminIndexMongoActor=system.actorOf(Props[RegularAdminIndexMongoActor],name = "RegularAdminIndexMongoActor")
log.info("created a new one "+regularAdminIndexMongoActor.path.toString())
actorRef=regularAdminIndexMongoActor
}
log.info("whats is in actorRef " + actorRef)
actorRef
}
и я вызываю код следующим образом
log.info("getting ref"+getRegularAdminIndexMongoActor)
and the output is
15:33:39.082 555049 [play-internal-execution-context-1] Global$ INFO - whats in actorRef null
15:33:39.082 555049 [play-internal-execution-context-1] Global$ INFO - getting ref null
15:33:39.083 555050 [play-internal-execution-context-1] play INFO - Application started (Dev)
15:33:39.151 555118 [ForkJoinPool-4-worker-7] Global$ INFO - actor exists Actor[akka://ActorSystem/user/RegularAdminIndexMongoActor#-1022921773]
как я могу получить фактический ActorRef, который дает мне ноль, но актер создает, и я попытался сохранить ссылку в обоих блоках, выполнив это
actorRef=result //success block
actorRef=regularAdminIndexMongoActor //failure block
я думаю, что он возвращает значения перед вызовом onComplete и возвращает null, поскольку я инициализировал переменную null в начале моей функции, как я могу это исправить? пожалуйста, помогите мне, как я могу достичь желаемого ActorRef
sel.resolveOne().mapTo[ActorRef].recover{case t => system.actorOf(Props[RegularAdminIndexMongoActor],name = "RegularAdminIndexMongoActor")}
даст вамFuture[ActorRef]
. Если вам нужноActorRef
- используйте блокировкуAwait.result(f, timeout)
- person dk14   schedule 30.12.2015var
s - совершенно плохая идея, так как вашonSuccess
/onFailure
вызывается в другом потоке и может вызываться после возвратаgetRegularAdminIndexMongoActor
- person dk14   schedule 30.12.2015