在akka演员中前进和讲述之间的区别
Posted
技术标签:
【中文标题】在akka演员中前进和讲述之间的区别【英文标题】:Difference between forward and tell in akka actors 【发布时间】:2014-09-26 17:48:18 【问题描述】:告诉和转发有什么区别,以防我发送相同的消息:
case msg: Message =>
otherActor tell (msg,sender)
和
case msg: Message =>
otherActor forward msg
【问题讨论】:
【参考方案1】: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"
【讨论】:
【参考方案2】:target.tell(message, getSelf()); 最终对象结果 = ""; target.forward(result, getContext());
这里, getself() 是actor的自我引用。 getcontext() 是主管参考。
【讨论】:
【参考方案3】:sender()
在接收端会有所不同。
使用 tell(也称为 !
)发送消息:
A
告诉消息M
到B
。 B
告诉该消息给C
。 C
认为消息M
的sender()
是B
。
使用forward发送消息:
A
告诉消息M
到B
。 B
转发该消息到C
。C
认为消息M
的sender()
是A
。
值得指出的是,当使用tell
显式设置消息的发件人时,您可以实现与forward
相同的效果,但这不是典型的Akka 风格:
// inside `B`, when received `msg` from `A`
C tell (msg, A)
==
C forward msg
更多信息请参阅docs about forward。
【讨论】:
其实在他上面的例子中,他使用tell(msg,sender)
,那么就相当于forward。对吗?
是的,这正是 forward 的实现方式:def forward(message: Any)(implicit context: ActorContext) = tell(message, context.sender())
:-) Happy hakking!
也只是在查看源代码。很容易阅读这些东西:-)
例如:发件人!消息是等于发件人告诉消息还是发件人转发消息
!
(感叹号)是tell
。 forward 没有符号方法。【参考方案4】:
Tell 将发送者设置为发送消息的参与者。
转发保留邮件的原始发件人。
【讨论】:
加 1 以保持简单以上是关于在akka演员中前进和讲述之间的区别的主要内容,如果未能解决你的问题,请参考以下文章