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
    }
  }

しかし、これは機能しません。ポーラーを開始すると、アクターは一度だけ呼び出されます

pollingActor ! "始める"

私は何を間違っていますか?アクターのループを誤解しましたか?

4

2 に答える 2

1

アクターを Akka に切り替えることから始めます。Play はすでに Akka の上に構築されており、scala アクター API は廃止されており、間もなく削除される予定です。次に、AkkaActorSystem Schedulerを活用してスケジューリングの側面を処理し、アクター自体にポーリングのみを処理させることができます。リファクタリングされたアクターは次のようになります。

import akka.actor._

class PollingActor extends Actor{
  def receive = {
    case "poll" => 
     //do polling work here
  }
}

次に、アクターの外部で実行をスケジュールします。必要なのは、ActorSystemplay が実行されているへの参照だけです。

import scala.concurrent.duration._

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

この例では、は100 ミリ秒ごとにメッセージをpoller送信します。"poll"ポーリングを停止したい場合は、への呼び出しから返され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 に答える