如何在 Akka Actor 中检查消息是否有发件人
How to check if message has sender in Akka Actor
有时发给演员的消息没有发件人,例如,如果他们是这样发送的:
actorRef.tell(Message(...), Actor.noSender)
一个用例是表明您对此不感兴趣Message
。
在 Actor 的 receive
方法中,如何检查 sender()
是否是一个 actor,而不是 noSender
?
我想到的最好的是以下基于 actor 路径的测试,但我不确定我是否可以依靠它来处理所有情况和未来的变化、Akka 集群等
if(sender.path.elements != "deadLetters" :: Nil) ...
如果没有发件人,我不希望回复转到 deadLetters
,因为在我的系统中,我将未送达的邮件视为出现问题的警告。
有没有更好更可靠的方法来检查是否有发件人?
我找到了解决方案:
val hasSender = sender != context.system.deadLetters
通常更好的模式是在您的消息中添加 replyTo: Option[ActorRef]
,这样更明确。
我在 Java-land 工作,需要类似的东西来记录发件人。我还在无法访问 Akka 上下文的 util class 中工作——我只有一个已通过的 ActorRef。一起去:
actorRef instanceof DeadLetterActorRef ? "[no-sender]" : actorRef.path().toStringWithoutAddress()
有时发给演员的消息没有发件人,例如,如果他们是这样发送的:
actorRef.tell(Message(...), Actor.noSender)
一个用例是表明您对此不感兴趣Message
。
在 Actor 的 receive
方法中,如何检查 sender()
是否是一个 actor,而不是 noSender
?
我想到的最好的是以下基于 actor 路径的测试,但我不确定我是否可以依靠它来处理所有情况和未来的变化、Akka 集群等
if(sender.path.elements != "deadLetters" :: Nil) ...
如果没有发件人,我不希望回复转到 deadLetters
,因为在我的系统中,我将未送达的邮件视为出现问题的警告。
有没有更好更可靠的方法来检查是否有发件人?
我找到了解决方案:
val hasSender = sender != context.system.deadLetters
通常更好的模式是在您的消息中添加 replyTo: Option[ActorRef]
,这样更明确。
我在 Java-land 工作,需要类似的东西来记录发件人。我还在无法访问 Akka 上下文的 util class 中工作——我只有一个已通过的 ActorRef。一起去:
actorRef instanceof DeadLetterActorRef ? "[no-sender]" : actorRef.path().toStringWithoutAddress()