如何在Akka Scheduler中重用actor ref

时间:2018-10-09 14:40:56

标签: java multithreading akka scheduler actor

我正在使用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;
}

我是演员的新手,并且非常基础的知识,如果这个问题确实有意义,请原谅我。

1 个答案:

答案 0 :(得分:0)

  

我想了解当我们使用Cancellable实例取消调度程序时究竟发生了什么?它也会杀死ActorRef吗?

不,不是。演员的生命周期与计划任务无关。

  

每次调用此buildScheduler方法时,我们都应该重用同一个ActorRef

这取决于您的用例,如果您的参与者保持要在计划之间保持的状态,则应在buildScheduler之外创建参与者并传递ActorRef

  

关于消息,即使我们在Cancellable instace上调用cancel之后,消息也将永远存在于内存中,并且只有在垃圾回收器调用时内存才会被清理

在Java中,内存总是由垃圾收集器回收,因此在取消任务后,如果SchedulerActorMessage调用方未引用传递的buildScheduler,将对其进行垃圾收集