ich diesen Code schriebWarum ist meine Schauspieler erstellt 2 mal
class TestActor extends Actor {
override def preStart(): Unit = {
println("going to start my test actor")
}
override def postStop(): Unit = {
println("came inside stop")
}
def receive = {
case msg: TestMessage => sender ! s"Hello ${msg.name}"
}
}
object TestActor {
val props = Props(new TestActor)
case class TestMessage(name: String)
}
Ich nenne es mit diesem Client-Code
object MyApp extends App {
val ac = ActorSystem("TestActorSystem")
val a = new ClassA(ac).sayHello()
val b = new ClassB(ac).sayHello()
for {
msg1 <- a
msg2 <- b
} {
println(msg1)
println(msg1)
}
Await.result(ac.terminate(), Duration.Inf)
}
class ClassA(ac: ActorSystem) {
def sayHello(): Future[String] = {
implicit val timeout = Timeout(5 seconds)
val actor = ac.actorOf(TestActor.props)
val msg = actor ? TestActor.TestMessage("foo")
msg.map(_.asInstanceOf[String])
}
}
class ClassB(ac: ActorSystem) {
def sayHello() : Future[String] = {
implicit val timeout = Timeout(5 seconds)
val actor = ac.actorOf(TestActor.props)
val msg = actor ? TestActor.TestMessage("bar")
msg.map(_.asInstanceOf[String])
}
}
ich die Ausgabe
going to start my test actor
going to start my test actor
Hello foo
Hello foo
came inside stop
came inside stop
Meine Frage sehen ist, dass Im Companion-Objekt hatte ich das Props-Objekt als val erstellt und daher gab es nur 1 val und das 1 val hatte 1 Instanz von new TestActor
Im Client verwendeten beide Klassen die gleiche Instanz des Aktorsystems. Daher hätte es nur 1 Akteur geben sollen und beide Nachrichten von Klasse A und Klasse B sollten zum selben Akteur gegangen sein.
Aber es scheint, dass beide Klassen ihre eigenen Actor-Instanzen haben.
Was sollte 'Requisiten (neue TestActor)' tun? Ich habe Mühe zu verstehen, welchen Konstruktor Sie verwenden möchten. Jeder Aufruf von 'system.actorOf' erstellt außerdem eine neue Instanz dieses Akteurs. Wenn Sie Ihren Akteur nur einmal erstellen möchten, können Sie ihn auch einfach außerhalb von 'ClassB' und' ClassA' erstellen und an ihn übergeben, wie Sie es mit dem ActorSystem tun. – mfirry