我想让一个演员睡上一段时间,具体来说,它应该决定是否让自己睡,这取决于一种情况:
class MyActor extends Actor {
def receive {
case "doWork" => doWork()
}
def doWork(): Unit = {
// doing some work
val condition = calculateCondition
if (condition) {
// sleep for 5 seconds
// Thread.sleep(5000)
}
}
}我很确定在演员里面叫Thread.sleep(5000)不是件好事,而且应该有另外一种方法。因此,我如何使它睡觉呢?
发布于 2013-10-30 05:59:23
我希望通过改变行为者的状态/行为来实现这一点。Akka为您提供了几种这样做的方法:您可以实现一个完整的状态机,或者使用context.become (并混合在akka.actor.Stash中),并让参与者传递(计划)消息给自己。对于这种情况,前者感觉太过分了,所以下面是我对它进行编码的方式:
import akka.actor._
import scala.concurrent.duration._
class MySleepyActor(duration: FiniteDuration = (5 seconds)) extends Actor with Stash {
import context._
override def preStart() { become(running) }
def receive = PartialFunction.empty
def running: Actor.Receive = {
case "doWork" =>
if (doWork()) {
scheduleReactivate
become(paused)
}
case "wakeUp" => // already awake
}
def paused: Actor.Receive = {
case "doWork" => stash()
case "wakeUp" =>
unstashAll()
become(running)
}
def scheduleReactivate: Unit = {
system.scheduler.scheduleOnce(duration, self, "wakeUp")
}
def doWork(): Boolean = {
// doing some work, then:
calculateCondition
}
}注意:我还没有测试过这个代码!不过,应该给你一些工作上的想法。
https://stackoverflow.com/questions/19674341
复制相似问题