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