如何告诉akka演员向其他演员发送消息';s邮箱成功吗?

如何告诉akka演员向其他演员发送消息';s邮箱成功吗?,akka,lookup,actor,sender,Akka,Lookup,Actor,Sender,以下是我的任务关键型应用程序中的场景: 参与者A执行一些资源密集型工作,然后在另一个物理unix设备上向参与者B发送消息。B正在访问外部网络元素,处理消息可能需要很长时间。然后,B将处理结果发送回A Q1:A使用B的路径查找B。如果B的unix框关闭或B尚未启动,则查找将失败。akka doc说返回了一封类似actor ref的死信。如何测试返回的是正常的actor ref还是类似actor ref的死信 Q2:假设B的正常参与者ref是return。如果A使用B.tell()向B发送消息,而消

以下是我的任务关键型应用程序中的场景: 参与者A执行一些资源密集型工作,然后在另一个物理unix设备上向参与者B发送消息。B正在访问外部网络元素,处理消息可能需要很长时间。然后,B将处理结果发送回A

Q1:A使用B的路径查找B。如果B的unix框关闭或B尚未启动,则查找将失败。akka doc说返回了一封类似actor ref的死信。如何测试返回的是正常的actor ref还是类似actor ref的死信

Q2:假设B的正常参与者ref是return。如果A使用B.tell()向B发送消息,而消息无法到达B的邮箱(该邮箱是持久的),我如何知道发生了这种情况,以便A可以将消息发送到具有持久邮箱的本地参与者C?C将永远尝试将消息传递给B,直到成功。

回答1:
system.actor(someRemotePath)
始终为您提供一个远程actor ref,并且无法通过检查此ref来确定它所指向的actor是否存在或是否可以访问。确定给定URI上是否有参与者的唯一方法是发送一条消息:如果您收到回复,那么它是活动的;如果在一段合理的时间后没有回复,您必须假设它已关闭和/或重试,尽管很可能由于防火墙重新启动或其他原因导致回复消息丢失

答复2: 您的actor C是所有问题的解决方案:您需要始终发送到C,并让它确保消息最终被远程actor确认。在Akka中无法确定给定消息是否已发送到邮箱,因为这并不意味着参与者无论如何都可以成功处理该消息


一般来说,我建议您阅读上的文档,尤其是在实施任务关键型应用程序之前。

Roland非常感谢您的快速回复!罗兰非常感谢您的快速回复!为了解决问题1,我将让参与者B回复一条简单的ping消息。为了解决问题2,我将尝试以下解决方案:参与者B使用非持久邮箱。B将消息持久保存在DB中,然后发送回ack。