2

こんにちは私はakka俳優がいます:

public class StatusActor  extends UntypedActor {
public static ActorRef instance = Akka.system().actorOf(
        new Props(StatusActor.class));

public void onReceive(Object message) {
    Logger.info("Message received");
}

}

そして、5分ごとにスケジュールを作成します。

Akka.system().scheduler().schedule(
        Duration.create(60, TimeUnit.SECONDS),
        Duration.create(5, TimeUnit.MINUTES), StatusActor.instance, null);

私が抱えている問題は、今回は動的に変更したいですか?これを行う方法はありますか?それを止める方法が見つかりません。だから、私はそれをもう一度始めることができます。

私が考えた唯一のハック方法は、onReceiveの最後に、akkaスケジュールを呼び出して再開し、すべての値を1回実行するように変更し、StatusActorに頻度の静的変数を設定することです。

誰かが俳優を止める方法/それにアクセスする方法を教えてくれるなら、とても役に立ちます。

4

2 に答える 2

2

IDE またはドキュメントで schedule の戻り値を見ると、Cancellable が返されていることがわかるため、前のスケジュールをキャンセルして新しいスケジュールを設定できます。

それが役立つことを願っています!

乾杯、√</p>

于 2012-06-19T11:42:23.293 に答える
1

あなたがする必要があるいくつかのステップ:

1 グローバルキー値変数が必要です。通常の HashMap はマルチスレッド環境では安全ではないため、ここでは ConcurrentHashMap を使用します。

var schedulerIDs = new ConcurrentHashMap[String, Cancellable]().asScala

2 スケジューラーを作成するたびに、それをキー値変数に格納する必要があります。キーを設計する必要があります。ここでは、スケジューラの作成時間と、このスケジューラを作成したユーザーをキーとして使用します (一意であり、元に戻すのが簡単だからです)。そして、その値はキャンセル可能な変数です。(ただのキャンセル型なので中身は読めませんのでご注意ください。)

val schedulerID = system.scheduler.schedule(initialDelay, interval, myActor, subMessage)

val schedulerKey = startTime + userName
val filterOption = schedulerIDs.get(schedulerKey)
filterOption match {
  case None =>
    schedulerIDs += schedulerKey -> schedulerID
  case _ =>
}

3 1 つのスケジューラーを変更する場合、その情報をキー値変数からフェッチして、キャンセル可能な変数を取得する必要があります。次に、このキャンセル可能な変数を使用して、まずこのスケジューラをキャンセルし、このスケジューラをこのキー値変数から削除します。

def removeScheduler(createTime: String, userName: String) {
  val schedulerKey = createTime + userName
  val filterOption = schedulerIDs.get(schedulerKey)
  filterOption match {
    case None =>
    case Some(value) =>
      value.cancel()
      schedulerIDs.remove(schedulerKey)
  }
}

4 最後のステップは、新しいスケジューラーを作成してステップ 2 に進み、ステップ 1 に戻ってそれを保管することです。

このソリューションでは、グローバル変数を使用してスケジューラ情報を保存します。その利点は高速ですが、欠点は、サーバーがダウンすると、これらの情報がすべて失われることです。サーバーがダウンすると、グローバル変数がなくなるためです。

したがって、通常、Step1 でスケジューラー情報を DB に保存して、スケジューラー情報 (初期化時間、間隔など) に従ってすべてを元に戻します。新しいスケジューラを作成するのとまったく同じです。しかし、ユーザーやフロントエンドはそれに気づきません。

于 2015-12-11T14:43:52.017 に答える