! 的源码:
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unittell 的源码:
final def tell(msg: Any, sender: ActorRef): Unit = this.!(msg)(sender)forward 的源码:
def forward(message: Any)(implicit context: ActorContext) = tell(message, context.sender())通过源码,我们可以轻而易举的知道 :
! 发送的消息的发送者通过一个隐式转换,把一个ActorRef转换成sender,如果找不到ActorRef的话,那个发送者就是noSender。
forward 发送消息的发送者是当前消息的上一个发送者。
即:
A To B, B To C
如果通过!的方式发送消息,则C接收到的消息的发送者是B.
如果通过 forward 的方式发送消息,则C接收到的消息的发送者是A.
如果希望 !的方式发送消息的同时携带发送者消息,则可以使用 .!(msg)(sender)
如果希望关掉actor,直接shutdown或者使用父亲actor的stop,在actor内部还可以使用context.stop(self)
本文探讨了Akka Actor系统中使用`!`操作符和`forward`方法发送消息的区别。`!`操作符会将消息发送者的ActorRef转换为sender,而`forward`则保留原始发送者。当从A到B再到C传递消息时,使用`!`时C收到的发送者是B,使用`forward`时C收到的发送者是A。若要保持`!`发送者的原始信息,可使用`.!(msg)(sender)`。另外,关闭Actor可采用shutdown或父Actor的stop方法,内部可使用`context.stop(self)`。
与forward的区别&spm=1001.2101.3001.5002&articleId=44257843&d=1&t=3&u=cc82cfa78f09469b935c2e1ab5baba82)
1146

被折叠的 条评论
为什么被折叠?



