Program Club

Akka 배우의 Forward와 Tell의 차이점

proclub 2020. 12. 11. 18:57
반응형

Akka 배우의 Forward와 Tell의 차이점


동일한 메시지를 보낼 경우 tell과 forward의 차이점은 무엇입니까?

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



자세한 정보 는 forward 에 대한 문서를 참조하십시오 .


Tell은 보낸 사람을 메시지를 보내는 행위자로 설정합니다.

전달은 메시지의 원래 보낸 사람을 유지합니다.


target.tell (message, getSelf ()); 최종 개체 결과 = ""; 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"
}

참고 URL : https://stackoverflow.com/questions/25115547/difference-between-forward-and-tell-in-akka-actors

반응형