java - 为什么在akka中有receiver.tell(msg,sender)而不是sender.tell(msg,receiver)?
问题描述
我是akka的初学者。有人可以向我解释一下为什么这样定义的tell方法:
receiver.tell(msg, sender);
在我看来,有人向其他人发送消息,在 OOP 中它会:
sender.tell(msg, receiver)
发送者告诉接收者消息
解决方案
让我试着用一个例子来解释这一点。
第 1 节:
只需将其视为两个人(例如A和B)之间的短信。
如果A收到B的消息,则A is the Receiver
和B is the Sender
。假设,如果 A 发送一条消息,那么,A becomes the Sender
而B becomes Receiver
因此,发送方和接收方实际上取决于消息的流动方向。两者都将充当发送者和接收者。
来到你的例子..
作为方法中的ActorRef
第二个参数传递的tell()
表示谁发送了消息,而调用ActorRef
谁的tell
方法是接收者。
一般来说,这Reciever.tell(message, sender)
两个地方都一样。但是,您可以将其称为Sender.tell(msg, receiver)
回复最初发送消息的 Actor 的指示。
即使您说它是Sender.tell(msg, receiver)
,这里Sender
的部分是要接收消息的部分,而Receiver
部分是实际发送消息的部分(在这种情况下为回复)。
尝试逐行阅读和理解上面的内容,因为它可能看起来令人困惑。然后继续下面。
第 2 节:
现在,Reciever.tell(message, sender)
发送者不必总是发送消息的那个人。它也可以指向其他演员。或者它可以通过简单地传递而根本没有演员ActorRef.noSender()
。
现在考虑有三个演员A、B和C。如果我如下从 A 演员向 B 演员发送消息,
B.tell(message, C);
在 B 的上下文中,尽管 A 是实际的发送者,但 C 将是向 B 发送消息的那个人。因此,当您发送如下回复时,
getSender().tell(replyMsg, getSelf());
在这里,getSender()
方法将返回对 Actor C 而不是 Actor A 的引用。因此,Actor C 将收到回复消息。
如果假设,Actor A 发送了一条根本没有发件人参考的消息,如下所示,
B.tell(message, ActorRef.noSender())
然后在 B 的上下文中,将没有发送者。发件人不明。假设如果 B 尝试发送回复getSender().tell(replyMsg, getSelf())
,则没有用户 actor(A,B,C) 将收到消息,而是将其传递给称为 actor 的特殊类型的系统deadLetter
actor。
推荐阅读
- here-api - HERE 地图图块可以显示道路限速吗?
- .htaccess - .htaccess 文件中的 FilesMatch 不再工作
- r - 使用来自 NOAA 的历史高潮/低潮数据根据日期和时间将我的数据点分类为高或低
- java - 如何抑制 Octave io 包加载警告:“OpenJDK 64-Bit Server VM warning: Archived ... java.system.class.loader 属性
- c# - 实例化对象出现在层次结构中但不在场景中
- firebase - 此项目超出 Firebase 身份验证 SMS 配额
- c - reviews.csv 中的分段错误
- sql - 使获得最多积分的前 50 名用户
- flutter - 基于 AuthState flutter with riverpod 导航
- html - 当其中没有锚标签时隐藏一个div