我正在使用akka调度程序,如下面的代码所示。
每个用户都可以登录我的应用程序并可以为后台任务创建调度程序。为此,我正在使用Akka调度程序。
对于每个用户ID,我正在调用buildScheduler方法,如下所示。 在调用此方法之前,我将使用同一用户ID的Cancellable对象取消现有的调度程序。 (我实现了以用户ID为键,而可取消对象为值的静态地图)
即使我取消了现有的调度程序,actorSystem.actorOf()也会给出错误的actor名称而不是唯一错误。
我想了解当我们使用Cancellable实例取消调度程序时究竟发生了什么? 它也会杀死ActorRef吗?如果不是,那么每次调用此buildScheduler方法时是否应该重用同一ActorRef?
关于消息,即使我们在Cancellable instace上调用cancel之后,消息也将永远存在于内存中,并且仅当垃圾回收器调用时内存才会被清除吗?
public Cancellable buildScheduler(String actorName, SchedulerActorMessage message, long interval, TimeUnit timeUnit, long initialDelay, String actorMapKey) {
ActorRef daemonRef = actorSystem.actorOf(Props.create(SchedulerActor.class), actorName);
Cancellable cancellableActor = actorSystem.scheduler().schedule(FiniteDuration.apply(initialDelay, timeUnit),
FiniteDuration.apply(interval, timeUnit), daemonRef, message,
actorSystem.dispatcher(), ActorRef.noSender());
actorMap.put(actorMapKey, cancellableActor);
return cancellableActor;
}
我是演员的新手,并且非常基础的知识,如果这个问题确实有意义,请原谅我。
答案 0 :(得分:0)
我想了解当我们使用Cancellable实例取消调度程序时究竟发生了什么?它也会杀死ActorRef吗?
不,不是。演员的生命周期与计划任务无关。
每次调用此buildScheduler方法时,我们都应该重用同一个ActorRef
这取决于您的用例,如果您的参与者保持要在计划之间保持的状态,则应在buildScheduler
之外创建参与者并传递ActorRef
。
关于消息,即使我们在Cancellable instace上调用cancel之后,消息也将永远存在于内存中,并且只有在垃圾回收器调用时内存才会被清理
在Java中,内存总是由垃圾收集器回收,因此在取消任务后,如果SchedulerActorMessage
调用方未引用传递的buildScheduler
,将对其进行垃圾收集