1

有时发送给参与者的消息没有发送者,例如,如果它们是这样发送的:

actorRef.tell(Message(...), Actor.noSender)

一个用例是表明您对对此的响应不感兴趣Message

在演员的receive方法中,我如何检查是否sender()是演员,反对noSender

我想出的最好的方法是基于参与者路径的以下测试,但我不确定我是否可以依靠它在所有情况下和未来的变化、Akka 集群等中工作。

if(sender.path.elements != "deadLetters" :: Nil) ...

如果没有发件人,我不希望回复转到deadLetters,因为在我的系统中,我将未送达的消息视为出现问题的警告。

有没有更好更可靠的方法来检查是否有发件人?

4

3 回答 3

3

我找到了解决方案:

val hasSender = sender != context.system.deadLetters
于 2019-07-28T09:20:37.823 回答
2

通常,更好的模式是在replyTo: Option[ActorRef]您的消息中添加一个,所以这更明确。

于 2019-07-30T15:20:54.857 回答
0

我在 Java 领域工作,需要类似的东西来记录发件人。我还在一个无法访问 Akka 上下文的 util 类中工作——我只有一个传递的 ActorRef。一起去:

actorRef instanceof DeadLetterActorRef ? "[no-sender]" : actorRef.path().toStringWithoutAddress()
于 2020-09-21T18:49:25.360 回答