2017-06-26 13 views
1

私は同じ結果を得るために2つの異なる方法を使用しますが、1つでは、なぜコールバックタイムを指定する必要があるのですか? それは同じものを線量ですか?actorSelectionとresolveActorRefの間のAkkaの相違

ActorRef resolveActorRef = getContext().getSystem() 
       .provider() .resolveActorRef(ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA")); 

上記のコードは私が継続時間を指定する必要がproveiderを取得しない場合は、いつでも なぜを待たずに、俳優のRefをretrive?

 ActorSelection actorSelection = getContext().getSystem() 
      .actorSelection(ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA")); 



     ActorRef ois = actorSelection.resolveOne(new Timeout(1000, TimeUnit.MILLISECONDS )) 
       .value().get().get(); 

答えて

0

最も明らかな違いは、あなたが俳優のパスにワイルドカードを使用する場合ActorSelectionは、複数のActorRef Sを表現することができるということはおそらくです。したがって、resolveOneの代わりにactorSelection.tellと電話すると、一致するすべての俳優にメッセージが配信されます。

私はresolveActorRefを使用することはありませんが、私はソース(ActorRefProviderActorSelection)から見ることができるものからActorRefProviderは、あなたが探しているActorことを見つけるために、rootGuardiangetChildを使用していますので、彼が見つかるまでダウンし、あなたの俳優ツリーの最上部から横断しますそれは最終的に(またはそうではない)。

ActorSelectionは、Identifyメッセージをask-pattern(したがってタイムアウト)を使用して選択に送信しようとし、応答を受け取った場合、それは応答を得たActorRefを提供します。送信するために解決する必要はありません。これはところで、あなた(Akka Docsので、あなただけの俳優を解決したい場合は、私がActorSelectionとなるだろう:。

resolveActorRefは、あなた自身のシリアライザを記述する場合に使用しているようですメッセージ)。

関連する問題