Akka ScatterGatherFirstCompletedRouter返回后,如何杀死其他路由者?

Akka ScatterGatherFirstCompletedRouter返回后,如何杀死其他路由者?,akka,Akka,我使用的是ScatterGatherFirstCompletedRouter,它返回第一个完成的参与者的答案。这很好,但是其他一些演员超时了。即使我赶上了暂停时间,这仍然是浪费时间和资源。我可以向演员们发送一个Kill,但这会发出一个不同的信息,而且对于时间仍然没有任何作用(出于某种原因)。处理这一问题的最佳方法是什么?与其让散乱收集第一个完整路由器的直接子代做这项工作,不如让他们委托给另一个参与者。确保跟踪原始请求者,以便其他参与者可以向其发送响应 也许它可以更干净,但以下是我得到的(其中Va

我使用的是ScatterGatherFirstCompletedRouter,它返回第一个完成的参与者的答案。这很好,但是其他一些演员超时了。即使我赶上了暂停时间,这仍然是浪费时间和资源。我可以向演员们发送一个
Kill
,但这会发出一个不同的信息,而且对于时间仍然没有任何作用(出于某种原因)。处理这一问题的最佳方法是什么?

与其让散乱收集第一个完整路由器的直接子代做这项工作,不如让他们委托给另一个参与者。确保跟踪原始请求者,以便其他参与者可以向其发送响应

也许它可以更干净,但以下是我得到的(其中
ValidBoardActor
ScatterGatherFirstCompletedRouter
一起使用):


Yo可以实现您的路由对象,使其在可取消期货()内执行计算,在未来成功执行时,与原始发件人处理此类期货的集合-将计算结果发送给自身并将其发送给原始发件人,在接收Kill/Cancel消息时-取消集合中的所有未来(并有选择地停止自身)。“这仍然是浪费时间和资源。”--这是ScatterGatherFirstCompletedRouter的一个属性,因为尽管您只使用第一个结果,但您会将作业相乘。如果您关心资源,您可能应该使用不同的路由策略。
class ValidBoardActor extends Actor {
  private implicit val timeout = Timeout(12.seconds)

  private lazy val generateBoardActor = context.actorFor(s"/user/${GenerateBoardActor.name}")

  private def stopProcessing: Receive = {
    case _ =>
  }

  private def processBoards(requester: ActorRef, piecesConfigSpec: Configuration.PiecesConfigSpec*): Receive = {
    case board: Board => {
      if (board.check) {
        requester ! board

        context.become(stopProcessing)
      } else {
        self ! GenerateBoard(piecesConfigSpec: _*)

        context.become(processRequests(requester))
      }
    }
  }

  private def processRequests(requester: ActorRef): Receive = {
    case GenerateBoard(configuration @ _*) => {
      generateBoardActor ! GenerateBoard(configuration: _*)

      context.become(processBoards(requester, configuration: _*))
    }
  }

  def receive = {
    case message => {
      self forward message

      context.become(processRequests(sender))
    }
  }
}