如何使用Play 2.0和Scala创建周期轮询器

如何使用Play 2.0和Scala创建周期轮询器,scala,playframework,playframework-2.0,actor,Scala,Playframework,Playframework 2.0,Actor,我想创建一个周期轮询器,它每隔x毫秒轮询一次 我想通过URL启动和停止它 val pollingActor = actor { var loop = true loopWhile(loop) { react { case "Stop" => { Console.println("Poller Stopping") loop = false exit } c

我想创建一个周期轮询器,它每隔x毫秒轮询一次

我想通过URL启动和停止它

val pollingActor = actor {
    var loop = true
    loopWhile(loop) {
      react {
        case "Stop" => {
          Console.println("Poller Stopping")
          loop = false
          exit
        }
        case "Start" => {
          Console.println("Poller Starting")
          loop = true
        }
      }
      pollMyResults() // this is my poller
    }
  }
但是,这不起作用,当我开始调查时,演员只会接到一次电话

民意调查员!“开始”


我做错了什么?我弄错了演员的循环了吗

我会先把你的演员换成阿卡。Play已经建立在Akka之上,scala actor API已经被弃用,不久将被删除。然后,您可以利用Akka
actor系统
调度器
来处理调度方面,让actor自己只处理轮询。重构的参与者可能如下所示:

import akka.actor._

class PollingActor extends Actor{
  def receive = {
    case "poll" => 
     //do polling work here
  }
}
然后在参与者之外安排它的执行。您所需要的只是对运行在以下平台上的
ActorSystem
的引用:

import scala.concurrent.duration._

val poller = system.actorOf(Props[PollingActor], "poller")
val cancellable = system.scheduler.schedule(0 milliseconds, 100 milliseconds, poller, "poll")

在本例中,
轮询器
将每隔100毫秒发送一条
“poll”
消息。如果要停止轮询,则可以在调用
计划
返回的
cancelable
引用上调用
cancel

您可以使用Akka调度程序

Akka.system.scheduler.schedule(1 seconds, interval, tracker, Tick)
请参阅“我的宠物”中的工作示例