FastTracks / TheAkkaWay

Akka Chinese Book / What should be included in it?
Apache License 2.0
19 stars 3 forks source link

tell(!)方法的sender与陷阱 #44

Open PipsqueakH opened 7 years ago

PipsqueakH commented 7 years ago

actor ! msg

中,tell 方法的签名是

  def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
  final def tell(msg: Any, sender: ActorRef): Unit = this.!(msg)(sender)

这里的Actor.noSender的定义为

  /**
   * Default placeholder (null) used for "!" to indicate that there is no sender of the message,
   * that will be translated to the receiving system's deadLetters.
   */
  final val noSender: ActorRef = null

如果在一个actor内部调用tell方法,noSender即为自己,如果在外部调用的话即为null.

另,在测试时, 可以显示指定消息的发送者为TestProbe,例如

actor.tell(msg, TestProbe().ref)

这在测试需要接受来自多个不同的actor的消息的actor时非常有用。

gabrywu commented 6 years ago

@PipsqueakH 这不算什么陷阱吧,这是基本特性啊。