在Akka Actors中,forward和tell之间的区别是什么?

62

如果我发送相同的消息,tell和forward有什么区别:

case msg: Message =>
  otherActor tell (msg,sender)

并且

case msg: Message =>
  otherActor forward msg
4个回答

123

sender() 在接收端会有所不同。


使用 tell(也称为 !)发送消息:

A tells 消息 MB
B tells 消息给 C
C 认为消息 Msender()B


使用 forward 发送消息:

A tells 消息 MB
B forwards 消息给 C
C 认为消息 Msender()A



值得指出的是,当使用 tell 显式地设置消息发送者时,可以实现与 forward 相同的效果,但这不是典型的 Akka 风格:

// inside `B`, when received `msg` from `A`
C tell (msg, A) 
      == 
C forward msg



有关详细信息,请参阅关于前向的文档


6
实际上在上面的情况下,他使用了 tell(msg,sender),这就相当于转发。对吗? - mavilein
5
是的,这正是forward的实现方式:def forward(message: Any)(implicit context: ActorContext) = tell(message, context.sender()) :-) 祝您编写愉快! - Konrad 'ktoso' Malawski
1
我刚刚也看了一下源代码。这些东西读起来太容易了 :-) - mavilein
例如:sender!Message 等同于 sender 告诉 Message 或 sender 转发 message。 - Jeff Lee
!(感叹号)是 tellforward 没有符号方法。 - Konrad 'ktoso' Malawski

20

Tell设置消息发送者为执行发送消息的动作的人。

Forward保留消息的原始发件人。


2
只加1,为了保持简单 - Sagar

1

target.tell(message, getSelf()); final Object result = ""; target.forward(result, getContext());

这里, getSelf() 是该演员的自我引用。 getContext() 是监管者的引用。


0
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"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接