如何解决akka 演员能否在不同情况下回复消息
我正在使用 Akka HTTP 并且有一个 AnswerActor,我想做以下事情。
class AnswerActor() extends Actor {
var requestMap = mutable.Map[String,ActorRef]()
...
override def receive: Receive = {
// I want to store sender() here instead of reply in this case,because my reply is not available at this moment
case message: M1 => requestMap.put(sender().path.name -> sender())
// I want to reply when I receive M2,my reply is available now
case message: M2 => requestMap.get(...) ! MyReply
我使用 val ans = Await.result(questionActor ? M1)
和另一个演员向 M2
发送消息 AnswerActor
但没有回复,只有当我在以下(案例 M1)中添加一些回复时它才能工作
case message: M1 => requestMap.put(name -> sender())
sender() ! something
是否可以在 akka 中实现上述逻辑?
解决方法
根据您的有限描述,我怀疑 M2
在收到 questionActor
后没有被 M1
收到(或者至少在要求超时)。通常,无论 C 是在 A 之前还是之后发送消息,都不能保证从演员 A 发送到演员 B 的消息会在从演员 C 发送到演员 B 的消息之前收到(顺序保证是,如果演员 A向actor B发送消息1然后2然后3,在收到1或2之前不会收到3,在收到1之前不会收到2)。
通常,在参与者或流中使用 Await
不是一个好主意,因为这会阻止参与者处理任何消息。在 actor 中,最好使用管道模式:
import akka.pattern.pipe
(questionActor ? M1).pipeTo(context.self)
如果您想忽略(或隐藏)除 MyReply
之外的每条消息,您可以立即使用 context.become
安装一个新的消息处理程序,它可以根据需要忽略/隐藏。
在流中,通常最好使用 mapAsync
或在某些情况下(仅限 Akka 2.6.x)ask
流阶段以非阻塞方式执行询问。>
使用 Await.result
也可能直接导致您的问题,具体取决于可用内核/vCPU 的数量和 Akka 版本:阻塞可能会阻止任何 actor 或流阶段获得 CPU 时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。