Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 更改akka任务的计划时间_Playframework_Akka - Fatal编程技术网

Playframework 更改akka任务的计划时间

Playframework 更改akka任务的计划时间,playframework,akka,Playframework,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分钟为它创建

嗨,我有一个阿克卡演员:

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计划重新开始,并更改所有值以运行一次,并在StatusActor中为频率设置一个静态变量


如果有人能告诉我如何阻止一个参与者/访问它,那将非常有帮助。

如果您在IDE或中查看schedule的返回值,您会看到它返回一个可取消的,因此您可以取消以前的并计划一个新的

希望有帮助

干杯,

您需要执行的几个步骤:

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

var schedulerIDs = new ConcurrentHashMap[String, Cancellable]().asScala
2每次创建调度程序时,都需要将其存储到键值变量。您需要设计您的密钥,这里我使用调度程序的创建时间和创建此调度程序的用户作为密钥(只是因为它是唯一的,而且我很容易将其还原回来)。它的值是它的可取消变量。(请记住,您无法读取其内容,因为它只是可取消类型。)

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存储它

此解决方案使用全局变量存储计划程序信息。它的好处是速度快,但缺点是当服务器关闭时,所有这些信息都会消失。因为当服务器关闭时,全局变量将消失


因此,通常我会在步骤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)
  }
}