在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 告诉消息MBB 告诉该消息给CC认为消息Msender()B

使用forward发送消息:

A 告诉消息MBB 转发该消息到CC 认为消息Msender()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演员中前进和讲述之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何从演员本身中获取 Akka 演员的名字?

每个数据库实体一个 Akka 演员?

akka http:Akka 流与演员建立休息服务

如何在非对称系统中将对象发送到远程 akka 演员

使用 akka 演员休眠

Java Akka Actor 和流