如何从路由器向路由器发送消息?
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
...
}
我正在尝试使用 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
...
}