Подтвердить что ты не робот

Разница между форвардом и рассказом в акковых актерах

В чем разница между сообщением и переадресацией, в случае, если я отправлю одно и то же сообщение:

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

и

case msg: Message =>
  otherActor forward msg
4b9b3361

Ответ 1

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



Для получения дополнительной информации см. документы о переходе.

Ответ 2

Tell устанавливает отправителя в качестве актера, отправляющего сообщение.

Вперед сохраняет исходного отправителя сообщения.

Ответ 3

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

Здесь  getelf() является самооценкой актера.  getcontext() является ссылкой супервизора.

Ответ 4

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