Quelle est la différence entre tell et forward, au cas où j'enverrais le même message:
case msg: Message =>
otherActor tell (msg,sender)
et
case msg: Message =>
otherActor forward msg
La sender()
sera différente chez le destinataire.
Le message envoie en utilisant tell (également appelé !
):
A
dit message M
à B
. B
dit à ce message à C
. C
pense que la sender()
du message M
est B
.
Le message envoie en utilisant forward:
A
dit message M
à B
. B
transmet ce message à C
.C
pense que la sender()
du message M
est A
.
Il est intéressant de noter que vous pouvez obtenir le même résultat que forward
lorsque vous définissez explicitement l'expéditeur d'un message à l'aide de tell
, mais ce n'est pas typique du style Akka
// inside `B`, when received `msg` from `A`
C tell (msg, A)
==
C forward msg
Pour plus d’informations, reportez-vous à la documentation relative à forward .
Tell définit l'expéditeur comme l'acteur envoyant le message.
Forward conserve l'expéditeur d'origine du message.
target.tell (message, getSelf ()); final Object result = ""; target.forward (resultat, getContext ());
Ici, getself () est l'auto-référence de l'acteur . getcontext () est la référence du superviseur.
import akka.actor.{Actor, ActorSystem, Props}
case object FromActor3
/**
* forward method: Forwards the message and passes the original sender actor as the sender.
*/
object ActorForward extends App {
class ActorExample extends Actor {
def receive = {
case message: String =>
println(s"Message received from ${sender.path.name}, message = $message")
val child = context.actorOf(Props[Actor2], "ChildActor")
child ! message
case FromActor3 => println("Response when forwarded by Actor2 to Actor3")
}
}
class Actor2 extends Actor {
def receive = {
case message: String =>
println(s"Message received from ${sender.path.name}, message = $message")
val child = context.actorOf(Props[Actor3], "ChildActor")
println("forwarding...")
child forward message
case _ => println("Unknown message")
}
}
class Actor3 extends Actor {
def receive = {
case message: String =>
println(s"Message received from ${sender.path.name}, message = $message")
sender ! FromActor3
case _ => println("Unknown message")
}
}
val actorSystem = ActorSystem("ActorSystem")
val actor = actorSystem.actorOf(Props[ActorExample], "RootActor")
actor ! "Hello"
}