как повторно использовать актер ref в планировщике Акка - PullRequest
0 голосов
/ 09 октября 2018

Я использую планировщик akka, как показано в коде ниже.

Каждый пользователь может войти в мое приложение и создать планировщик для фоновой задачи. Для этого я использую планировщик Akka.

Для каждого идентификатора пользователя я вызываю метод buildScheduler, как показано ниже.Перед вызовом этого метода я отменяю существующий планировщик, используя объект Cancellable для того же идентификатора пользователя.(Я реализовал статическую карту с идентификатором пользователя в качестве ключа и отменимым объектом в качестве значения)

Даже после того, как я отменяю существующий планировщик, actorSystem.actorOf () выдает имя актера error не уникальную ошибку.

Я быХотите понять, что именно происходит, когда мы отменяем планировщик с помощью экземпляра Cancellable?Это также убивает ActorRef, если нет, мы должны повторно использовать один и тот же ActorRef каждый раз, когда мы вызываем этот метод buildScheduler?

Как насчет сообщения, оно будет в памяти навсегда, даже после того, как мы вызовем метод Cancel в inslacelast instace и memory?будет очищаться только при вызове сборщика мусора?

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 голосов
/ 09 октября 2018

Я хотел бы понять, что именно происходит, когда мы отменяем планировщик с помощью экземпляра Cancellable?Это также убивает ActorRef

Нет, это не так.Жизненный цикл актера не зависит от запланированной задачи.

если мы будем использовать один и тот же ActorRef каждый раз, когда мы вызываем этот метод buildScheduler

Это зависит от вашего варианта использования, если вашактер поддерживает состояние, которое вы хотите поддерживать между расписаниями, вы должны создать актора за пределами buildScheduler и передать ActorRef.

Как насчет сообщения, оно будет в памяти навсегда, даже после того, как мывызовите отмену на Cancellable instace, и память очистится только тогда, когда сборщик мусора вызовет

В Java сборщик мусора всегда освобождает память, поэтому после отмены задачи и если переданная SchedulerActorMessageнапример, вызывающий buildScheduler не ссылается на него, он будет собирать мусор.

...