В чем разница между сообщением и переадресацией, в случае, если я отправлю одно и то же сообщение:
case msg: Message =>
otherActor tell (msg,sender)
и
case msg: Message =>
otherActor forward msg
В чем разница между сообщением и переадресацией, в случае, если я отправлю одно и то же сообщение:
case msg: Message =>
otherActor tell (msg,sender)
и
case msg: Message =>
otherActor forward msg
sender()
будет отличаться на принимающей стороне.
Сообщение отправляется с использованием tell (также известного как !
):
A
сообщает сообщение M
- B
. B
сообщает это сообщение C
. C
считает, что сообщение sender()
сообщения M
равно B
.
Сообщение отправляется с использованием прямой:
A
сообщает сообщение M
- B
. B
переслать это сообщение C
. C
считает, что сообщение sender()
сообщения M
равно A
.
Стоит отметить, что вы можете достичь того же, что и forward
при явной настройке отправителя сообщения с помощью tell
, однако это не типичный стиль Akka:
// inside `B`, when received `msg` from `A`
C tell (msg, A)
==
C forward msg
Для получения дополнительной информации см. документы о переходе.
Tell устанавливает отправителя в качестве актера, отправляющего сообщение.
Вперед сохраняет исходного отправителя сообщения.
target.tell(message, getSelf()); final Object result = ""; target.forward(result, getContext());
Здесь getelf() является самооценкой актера. getcontext() является ссылкой супервизора.
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"
}