1

アクターである抽象クラスがあり、このようなメソッドがあります

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")
4

1 に答える 1

7

子を作成するときactorOfcontext代わりに呼び出す必要があります。system

于 2013-04-09T18:50:44.013 に答える