0

アクターがまだ存在しないかどうかをチェックしているコードがあります。それを作成しますが、問題は私のコードが将来の 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 を取得するにはどうすればいいですか? null を与えますが、アクターが作成していて、これを実行して両方のブロックに参照を保存しようとしました

actorRef=result //success block
actorRef=regularAdminIndexMongoActor //failure block

onComplete を呼び出す前に値を返し、関数の開始時に変数 null を初期化したときに null を返すと思います。これを修正するにはどうすればよいですか? どうすれば目的の ActorRef を達成できるか教えてください

4

1 に答える 1

0

actorRef は sel.resolveOne() が終了するまで割り当てられない変数です。これは、値を返す前である可能性があります。あなたが本当にその方法でやっていることをしたいなら、あなたは使うことができます

import scala.concurrent._
import scala.concurrent.duration._

Await.result(f,Duration(6000,"millis"))

Await result は、将来の配信または 6 秒が経過するまでブロックされます。

今、他の人が述べているように、これは良い考えではありません。

まさにそのアクターを作成しているように見えるので、子に直接アクセスできます

val child = child(name)
child.getOrElse(getContext().actorOf(..., name))
于 2016-01-04T21:11:50.773 に答える