【问题标题】:how to reuse actor ref in akka scheduler如何在akka调度程序中重用actor ref
【发布时间】:2018-10-09 14:40:56
【问题描述】:

我正在使用 akka 调度程序,如下代码所示。

每个用户都可以登录到我的应用程序并可以为后台任务创建调度程序。我正在为此使用 Akka 调度程序。

对于每个用户 ID,我正在调用 buildScheduler 方法,如下所示。 在调用此方法之前,我将使用 Cancellable 对象为同一用户 ID 取消现有调度程序。 (我实现了以用户 ID 为键、可取消对象为值的静态映射)

即使在我取消现有调度程序后,actorSystem.actorOf() 也会给出错误 actor name not unique error。

我想了解当我们使用 Cancellable 实例取消调度程序时究竟会发生什么? 它是否也会杀死 ActorRef,如果不是,我们是否应该在每次调用此 buildScheduler 方法时重用相同的 ActorRef ?

那么消息呢,即使我们在 Cancellable 实例上调用 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;
}

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

【问题讨论】:

    标签: java multithreading akka scheduler actor


    【解决方案1】:

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

    不,它没有。 Actor 的生命周期独立于计划任务。

    我们是否应该在每次调用此 buildScheduler 方法时重用相同的 ActorRef

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

    消息呢,即使我们在 Cancellable instace 上调用 cancel 后,它是否会永远在内存中,并且只有在垃圾收集器调用时才会清理内存

    在Java中,内存总是被垃圾收集器回收,所以在任务被取消后,如果传递的SchedulerActorMessage没有被buildScheduler调用者引用,它将被垃圾收集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多