同じメッセージを送信する場合のtellとforwardの違いは何ですか:
case msg: Message =>
otherActor tell (msg,sender)
そして
case msg: Message =>
otherActor forward msg
sender()
は受信側で異なります。
tell(_!
_とも呼ばれます)を使用したメッセージ送信:
A
tellsメッセージM
からB
へ。B
tellsC
へのメッセージ。C
は、メッセージM
のsender()
がB
であると考えています。
forwardを使用したメッセージ送信:
A
tellsメッセージM
からB
へ。B
forwardsそのメッセージをC
に転送します。C
は、メッセージM
のsender()
が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"
}