如何从路由器向路由器发送消息?

How do I send a message to a routee from a router?

我正在尝试使用 Akka 2.4 中的 RoundRobinRoutingLogic 来完成 Jonas Boner 的 Pi 计算示例。该文档仅显示如何创建路由器,然后使用路由将消息发送回发件人。这只会导致一长串死信。

class Master(numOfWorkers: Int, numOfMessages: Int, numOfElements: Int,  listener: ActorRef) extends Actor {
  var pi: Double = _
  var numOfResults: Int = _
  val start: Long = System.currentTimeMillis

  val workerRouter = {
    val routees = Vector.fill(5) {
      val r = context.actorOf(Props[Worker])
      context watch r
      ActorRefRoutee(r)
    }
    Router(RoundRobinRoutingLogic(), routees)
  }

    def receive = {
        case Calculate => for (i <- 0 until numOfMessages) workerRouter.route(Work(i * numOfElements, numOfElements), sender())
        case Result(value) =>
          pi += value
          numOfResults += 1
          if (numOfResults == numOfMessages) {
            listener ! PiApproximation(pi, duration = (System.currentTimeMillis - start).millis)
            context.stop(self)
    }
  }
}

我定义了一个 Worker actor,它正在创建并添加到 workerRouter 的路由中。对于 Calculate 案例,我如何向 RoundRobinRoutingLogic 接下来选择的 Worker 发送 Work 消息?

问题是您将 sender() 传递给底层工作人员 ActorRef 作为结果的目的地,而不是将 ref 发送给 Master。如果您修改以下行,它应该可以解决您看到的问题:

//note the "self" instead of "sender()"
case Calculate => for (i <- 0 until numOfMessages) workerRouter.route(Work(i * numOfElements, numOfElements), self)

另外,我会"break up"你的代码如下:

def sendWork(i : Int) = 
  workerRouter.route(Work(i * numOfElements, numOfElements), self)

def receive = {
  case Calculate => (1 until numOfMessages) foreach sendWork

  ...
}