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

时间:2013-07-17 05:40:18

标签: akka

我正在使用ScatterGatherFirstCompletedRouter,它返回完成的第一个演员的答案。这很好,但其他一些演员超时。即使我抓住了超时,它仍然是浪费时间和资源。我可以向演员发送Kill,但这会发出不同的消息,但仍然没有做任何关于时间的事情(出于某种原因)。处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

不是让ScatterGatherFirstCompletedRouter的直接子女做这项工作,而是将他们委托给另一位演员。请务必跟踪原始请求者,以便其他参与者可以将响应发送给它。

也许它可以更干净,但这就是我得到的(ValidBoardActorScatterGatherFirstCompletedRouter一起使用的地方):

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))
    }
  }
}