首页 > 解决方案 > 为什么在akka中有receiver.tell(msg,sender)而不是sender.tell(msg,receiver)?

问题描述

我是akka的初学者。有人可以向我解释一下为什么这样定义的tell方法:

receiver.tell(msg, sender);

在我看来,有人向其他人发送消息,在 OOP 中它会:

sender.tell(msg, receiver)

发送者告诉接收者消息

标签: javaakka

解决方案


让我试着用一个例子来解释这一点。

第 1 节:

只需将其视为两个人(例如AB)之间的短信。

如果A收到B的消息,则A is the ReceiverB is the Sender。假设,如果 A 发送一条消息,那么,A becomes the SenderB 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()

现在考虑有三个演员ABC。如果我如下从 A 演员向 B 演员发送消息,

B.tell(message, C);

在 B 的上下文中,尽管 A 是实际的发送者,但 C 将是向 B 发送消息的那个人。因此,当您发送如下回复时,

getSender().tell(replyMsg, getSelf());

在这里,getSender()方法将返回对 Ac​​tor C 而不是 Actor A 的引用。因此,Actor C 将收到回复消息。

如果假设,Actor A 发送了一条根本没有发件人参考的消息,如下所示,

B.tell(message, ActorRef.noSender())

然后在 B 的上下文中,将没有发送者。发件人不明。假设如果 B 尝试发送回复getSender().tell(replyMsg, getSelf()),则没有用户 actor(A,B,C) 将收到消息,而是将其传递给称为 actor 的特殊类型的系统deadLetteractor。


推荐阅读