Si je désactive la ligne A, l'application HelloRemote ne peut pas recevoir le message "bonjour monde", il semble que si nous fermons trop vite le système d'acteur local, le message ne sera pas envoyé à distance?Quel est le moyen de fermer le client distant akka
Bien sûr, l'acteur local pourrait attendre un message de la part de la télécommande pour confirmer le message déjà reçu, mais si nous ajoutons un tel code, le processus sera synchrone, je ne veux pas que ça devienne RPC.
Je veux juste le rendre asynchrone, et aussi ne veux pas perdre de temps par "Thread.sleep (3000)", je veux que le client quitte le plus vite possible, une suggestion?
HelloRemote.scala
package remote
import akka.actor._
object HelloRemote extends App {
val system = ActorSystem("HelloRemoteSystem")
val remoteActor = system.actorOf(Props[RemoteActor], name = "RemoteActor")
}
class RemoteActor extends Actor {
def receive = {
case msg: String =>
println(s"received message '$msg'")
}
}
Local.scala
package local
import akka.actor._
object Local extends App {
val system = ActorSystem("LocalSystem")
val localActor = system.actorOf(Props[LocalActor], name = "LocalActor")
localActor ! "START"
}
class LocalActor extends Actor {
val remote = context.actorSelection(
"akka.tcp://[email protected]:5150/user/RemoteActor")
def receive = {
case "START" =>
remote ! "hello world"
Thread.sleep(3000) // Line A
context.stop(self)
context.system.shutdown
}
}
En outre, la pâte application.conf pour votre essai facile.
partie à distance:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
netty.tcp {
hostname = "127.0.0.1"
port = 5150
}
log-remote-lifecycle-events = off
}
log-dead-letters = off
log-dead-letters-during-shutdown = off
}
partie locale:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
}
log-dead-letters = off
log-dead-letters-during-shutdown = off
}
Au lieu de 'context.stop (auto)', vous pouvez envoyer un message 'PoisonPill' à soi-même, retirer la ligne A et à la réception de' PoisonPill' message que vous pouvez éteindre le système – curious
@curious, je me demande comment puis-je faire mon action après soi-même! PoisonPill, il semble, Akka va gérer ce message par lui-même, donc quelque chose comme prochaine ne fonctionne pas. case PoisonPill => println ("wow") – lagom
Corriger, Faire 'case object' pour un message personnalisé comme' KillLocal' et l'envoyer à 'self' et à la réception de' KillLocal' faire 'context.stop (self)'; 'context.system.shutdown' – curious