web-dev-qa-db-ja.com

akkaアクターにおけるforwardとtellの違い

同じメッセージを送信する場合のtellとforwardの違いは何ですか:

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

そして

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

sender()は受信側で異なります。


tell(_!_とも呼ばれます)を使用したメッセージ送信:

AtellsメッセージMからBへ。
BtellsCへのメッセージ。
Cは、メッセージMsender()Bであると考えています。


forwardを使用したメッセージ送信:

AtellsメッセージMからBへ。
BforwardsそのメッセージをCに転送します。
Cは、メッセージMsender()Aであると考えています。



指摘する価値は、forwardを使用してメッセージの送信者を明示的に設定するときにtellと同じことを実現できることですが、これは典型的なAkkaスタイルではありません。

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



詳細については、 forwardに関するドキュメント を参照してください。

Tellは、メッセージを送信するアクターとして送信者を設定します。

転送は、メッセージの元の送信者を保持します。

15
monkjack

target.tell(message、getSelf());最終オブジェクトの結果= ""; target.forward(result、getContext());

ここで、getself()はアクターの自己参照です。 getcontext()はスーパーバイザー参照です。

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