更改akka任务的预定时间

时间:2012-06-19 07:11:06

标签: playframework akka

嗨,我有一个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);

我遇到的问题是我想动态更改此时间吗?有什么方法可以做到这一点吗?我找不到任何方法来阻止它。那么我就可以重新开始吧。

我想到的唯一的hack方法是在onReceive结束时让它调用akka schedule再次启动,并将所有值更改为运行一次,并在StatusActor中为频率设置一个静态变量。 / p>

如果有人能告诉我如何阻止演员/获取演出将会非常有帮助。

2 个答案:

答案 0 :(得分:2)

如果您查看计划的返回值,无论是在IDE中还是在documentation中,您都会看到它返回一个可取消的值,因此您可以取消之前的计划并安排新的计划。< / p>

希望有所帮助!

干杯, √

答案 1 :(得分:1)

您需要执行以下几个步骤:

1您需要拥有全局键值变量。这里我使用ConcurrentHashMap,因为普通的HashMap在多线程环境中并不安全。

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如果要修改一个调度程序,需要从键值变量中获取其信息以获取其可取消的变量。然后使用此可取消变量首先取消此调度程序,并从此键值变量中删除此调度程序。

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中,以根据调度程序信息(如初始化时间,间隔等)恢复所有内容。完全像创建新的调度程序。但是用户或前端不会注意到它。