Was ist der Unterschied zwischen tell und forward, falls ich dieselbe Nachricht schicke:
case msg: Message =>
otherActor tell (msg,sender)
und
case msg: Message =>
otherActor forward msg
Die sender()
wird auf der Empfangsseite unterschiedlich sein.
Nachricht wird mit tell (auch bekannt als !
) gesendet:
A
erzählt Nachricht M
zu B
. B
tell diese Nachricht an C
. C
hält die sender()
der Nachricht M
für B
.
Nachricht wird mit Weiterleiten gesendet:
A
erzählt Nachricht M
zu B
. B
vorwärts diese Nachricht an C
.C
hält die sender()
der Nachricht M
für A
.
Erwähnenswert ist, dass Sie dasselbe erreichen können wie forward
, wenn Sie den Absender einer Nachricht explizit mit tell
setzen, dies ist jedoch kein typischer Akka-Stil:
// inside `B`, when received `msg` from `A`
C tell (msg, A)
==
C forward msg
Weitere Informationen finden Sie in den docs über forward .
Tell setzt den Absender als den die Nachricht sendenden Akteur.
Weiterleiten behält den ursprünglichen Absender der Nachricht bei.
target.tell (message, getSelf ()); final Object result = ""; target.forward (result, getContext ());
Hier, getself () ist die Selbstreferenz des Schauspielers . getcontext () ist die Supervisor-Referenz.
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"
}