如果我发送相同的消息,tell和forward有什么区别:
case msg: Message =>
otherActor tell (msg,sender)
并且
case msg: Message =>
otherActor forward msg
sender()
在接收端会有所不同。
使用 tell(也称为 !
)发送消息:
A
tells 消息 M
给 B
。
B
tells 消息给 C
。
C
认为消息 M
的 sender()
是 B
。
使用 forward 发送消息:
A
tells 消息 M
给 B
。
B
forwards 消息给 C
。
C
认为消息 M
的 sender()
是 A
。
值得指出的是,当使用 tell
显式地设置消息发送者时,可以实现与 forward
相同的效果,但这不是典型的 Akka 风格:
// inside `B`, when received `msg` from `A`
C tell (msg, A)
==
C forward msg
有关详细信息,请参阅关于前向的文档。
Tell设置消息发送者为执行发送消息的动作的人。
Forward保留消息的原始发件人。
target.tell(message, getSelf()); final Object result = ""; target.forward(result, getContext());
这里, getSelf() 是该演员的自我引用。 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"
}
tell(msg,sender)
,这就相当于转发。对吗? - mavileinforward
的实现方式:def forward(message: Any)(implicit context: ActorContext) = tell(message, context.sender())
:-) 祝您编写愉快! - Konrad 'ktoso' Malawski!
(感叹号)是tell
。forward
没有符号方法。 - Konrad 'ktoso' Malawski