0

我想创建一个定期轮询器,它每 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
    }
  }

但是,这行不通,演员只被调用一次,当我开始轮询时

投票演员!“开始”

我究竟做错了什么 ?我是否误解了演员的循环?

4

2 回答 2

1

我会先把你的演员换成 Akka。Play 已经构建在 Akka 之上,并且 scala actor API 已被弃用,并将很快被删除。然后,您可以利用 AkkaActorSystem Scheduler来处理调度方面,让参与者自己只处理轮询。重构后的 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")

在此示例中,poller"poll"每 100 毫秒发送一条消息。如果您想停止轮询,那么您只需调用从调用返回cancel的引用即可。cancellableschedule

于 2013-06-25T12:45:13.693 回答
1

您可以使用 Akka 调度程序

Akka.system.scheduler.schedule(1 seconds, interval, tracker, Tick)

有关我的宠物的工作示例,请参见此处

于 2013-06-25T12:48:22.327 回答