wake-up-neo.com

Unterschied zwischen Vorwärts- und Erzählen bei Akka-Schauspielern

Was ist der Unterschied zwischen tell und forward, falls ich dieselbe Nachricht schicke:

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

und

case msg: Message =>
  otherActor forward msg
53
Michał Jurczuk

Die sender() wird auf der Empfangsseite unterschiedlich sein.


Nachricht wird mit tell (auch bekannt als !) gesendet:

Aerzählt Nachricht M zu B
Btell diese Nachricht an C
C hält die sender() der Nachricht M für B.


Nachricht wird mit Weiterleiten gesendet:

Aerzählt Nachricht M zu B
Bvorwärts diese Nachricht an C.
C hält die sender() der Nachricht M für A.



Erwähnenswert ist, dass Sie dasselbe erreichen können wie forward, wenn Sie den Absender einer Nachricht explizit mit tell setzen, dies ist jedoch kein typischer Akka-Stil:

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



Weitere Informationen finden Sie in den docs über forward .

Tell setzt den Absender als den die Nachricht sendenden Akteur.

Weiterleiten behält den ursprünglichen Absender der Nachricht bei.

15
monkjack

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

Hier, getself () ist die Selbstreferenz des Schauspielers . getcontext () ist die Supervisor-Referenz.

1
Suresh Kumar
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"
}
0
Aamir