Акка кварцевый планировщик не запускает задания - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь использовать этот akka-кварц-планировщик в моем игровом проекте.Я создал двух актеров akka, добавил конфигурацию для актеров:

akka {
  quartz {
    schedules {
      HELLO_ACTOR {
        description = "A cron job that fires off every 10 seconds"
        expression = "0/10 0 0 ? * * *"
      }
      CLEANUP_ACTOR {
        description = "A cron job that fires off every 10 seconds"
        expression = "0/10 0 0 ? * * *"
      }
    }
  }
}

Я создал модуль и добавил планировщик, где я связываю актеров и планировщик:

protected void configure() {
        bindActor(HelloActor.class, HelloActor.NAME);
        bindActor(CleanupRunner.class, CleanupRunner.NAME);
        bind(QuartzSchedulerHelper.class).asEagerSingleton();
        bind(QuartzSchedulerExtension.class).toProvider(SchedulerJobInitializer.class);
    }


    private static class SchedulerJobInitializer implements Provider<QuartzSchedulerExtension> {
        private final QuartzSchedulerExtension quartzSchedulerExtension;

        @Inject
        public SchedulerJobInitializer(ActorSystem actorSystem) {
            this.quartzSchedulerExtension = new QuartzSchedulerExtension((ExtendedActorSystem) actorSystem);
        }

        @Override
        public QuartzSchedulerExtension get() {
            return quartzSchedulerExtension;
        }
    }

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

2018-07-06 11:51:44,947 [INFO] from org.quartz.impl.DirectSchedulerFactory in play-dev-mode-akka.actor.default-dispatcher-2 - Quartz scheduler 'QuartzScheduler~application

2018-07-06 11:51:44,947 [INFO] from org.quartz.impl.DirectSchedulerFactory in play-dev-mode-akka.actor.default-dispatcher-2 - Quartz scheduler version: 2.2.3

2018-07-06 11:51:44,950 [INFO] from org.quartz.core.QuartzScheduler in play-dev-mode-akka.actor.default-dispatcher-2 - Scheduler QuartzScheduler~application_$_application started.

2018-07-06 11:51:44,974 [INFO] from com.typesafe.akka.extension.quartz.QuartzSchedulerExtension in application-akka.actor.default-dispatcher-2 - Setting up scheduled job 'HELLO_ACTOR', with 'com.typesafe.akka.extension.quartz.QuartzCronSchedule@6a6c7b3b'

2018-07-06 11:51:45,005 [INFO] from com.typesafe.akka.extension.quartz.QuartzSchedulerExtension in application-akka.actor.default-dispatcher-2 - Setting up scheduled job 'CLEANUP_ACTOR', with 'com.typesafe.akka.extension.quartz.QuartzCronSchedule@2c32247d'

Acotrs должны запускаться каждые 10 секунд.Любая причина, почему это не работает, или что я должен добавить и где?

Вот код на github .

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Ваш фрагмент журнала не указывает, что ваши актеры зарегистрированы в планировщике. Это показывает, что задания Quartz успешно запланированы: в вашей конфигурации akka.quartz.schedules.HELLO_ACTOR и akka.quartz.schedules.CLEANUP_ACTOR являются заданиями , а не актерами, несмотря на то, что вы их назвали. (Я рекомендую переименовать эти работы, чтобы избежать путаницы.)

Учитывая ваши QuartzSchedulerHelper, не похоже, что ваши актеры зарегистрированы в планировщике:

List<String> actors = Arrays.asList(HelloActor.NAME, CleanupRunner.NAME);
for (String name : actors) {
  ActorRef actor = registry.actorFor(name);
  schedule(quartzSchedulerExtension, actor, name, RandomStringUtils.randomAlphabetic(10));
}

actorFor принимает путь актера в качестве аргумента. То, что вы передаете этому методу, это имя актера. Используйте путь актера:

String actorPath = "/user/" + name
ActorRef actor = registry.actorFor(actorPath)

Возможно, вы также захотите попробовать следующий путь актера:

String actorPath = "akka://application/user/" + name
0 голосов
/ 06 июля 2018

Вам все еще нужно составить расписание в коде, чтобы объявить, какое сообщение необходимо отправить и какому субъекту. В Scala вы бы сделали:

QuartzSchedulerExtension(context.system).schedule("HELLO_ACTOR", someActor, "Hello from the Quartz scheduler")
QuartzSchedulerExtension(context.system).schedule("CLEANUP_ACTOR", someOtherActor, "Clean up from the Quartz scheduler")

Если вы хотите остановить один из них, вы можете использовать метод cancelJob:

QuartzSchedulerExtension(context.system).cancelJob("HELLO_ACTOR")
...