アクターである抽象クラスがあり、このようなメソッドがあります
def getNewConnection(id: String): ActorRef
A class that subclasses it defines the method.
override def getNewConnection(id: String): ActorRef = {
val actorRef = system.actorOf(Props(new RsvpClusterableClientConnection(service, id)))
actorRef ! Subscribe(clientConnectionId)
actorRef
}
そして、そのactorRefを保存します。
問題は、私が context.children に行くとき、それは空です。同様に、子アクターが context.parent になった場合も ! "おい!" 親はメッセージを受け取りません。パスを見ると、context.partent は /users/ を示しており、REAL の親アクターは実際には /users/$2b のようなものです
同様の問題を抱えている人を見つけることができません。これは、次のようなテストです。
class ZombieTest extends TestKit(ActorSystem("zombietest")) with HelperSpec with ShouldMatchers {
import ExecutionContext.Implicits.global
[...]
val conActor = system.actorOf(Props(new ConnectionActor(testService1)))
}
編集
AgileSteelは正しいです。システムから作成すると、最上位のアクターが作成されます。コンテキストから作成すると、子が作成されます。
akka のドキュメントから:
デフォルトのコンストラクターでアクターを作成する
object Main extends App {
val system = ActorSystem("MySystem") val myActor =
system.actorOf(Props[MyActor], name = "myactor") The call to actorOf
ActorRef のインスタンスを返します。これは、Actor と対話するために使用できる Actor インスタンスへのハンドルです。ActorRef は不変であり、それが表す Actor と 1 対 1 の関係があります。ActorRef はシリアライズ可能で、ネットワーク対応でもあります。これは、シリアル化してネットワーク経由で送信し、リモート ホストで使用することができ、ネットワーク全体で元のノードの同じアクタを表すことを意味します。
上記の例では、アクターはシステムから作成されました。アクター コンテキストを使用して、他のアクターからアクターを作成することもできます。違いは、スーパーバイザー階層の配置方法です。コンテキストを使用する場合、現在のアクターは作成された子アクターのスーパーバイザーになります。システムを使用する場合、それはシステムによって監視されるトップ レベルのアクター (内部保護者アクター) になります。
class FirstActor extends Actor { val myActor =
context.actorOf(Props[MyActor], name = "myactor")