Dropwizard ScheduledExecutorService

В моем случае мне нужно запускать некоторые запланированные задачи (например, каждую минуту), выполняя некоторые проверки в БД и, при необходимости, некоторые подзадачи. Это не должно быть проверкой работоспособности БД!

В документации DW говорится:

«Следует отметить, что Environment имеет встроенные фабричные методы для управляемых экземпляров ExecutorService и ScheduledExecutorService. Подробности см. в LifecycleEnvironment#executorService и LifecycleEnvironment#scheduledExecutorService».

Кто-нибудь знает, как это реализовать в DW? Пытаясь поиграть с возможностями кода DW, я нашел это:

String nameFormat = "?What should this string contain?";
ScheduledExecutorServiceBuilder sesBuilder = environment.lifecycle().scheduledExecutorService(nameFormat);
ScheduledExecutorService ses = sesBuilder.build();
Runnable alarmTask = new AlarmTask();
ses.scheduleWithFixedDelay(alarmTask, 0, 5, TimeUnit.SECONDS);

Это правильный способ сделать это в DW? Кстати, работающий манекен:

  private static final class AlarmTask implements Runnable {
      DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
      Calendar cal = Calendar.getInstance();
        @Override public void run() {
          ++fCount;

            cal = Calendar.getInstance();
            System.out.println(fCount + "x BEEP:" + dateFormat.format(cal.getTime()));
        }
        private int fCount;
      }

Какова цель первоначального имени и используется ли оно где-нибудь? Надеюсь, кто-то может помочь.


person user3280180    schedule 23.10.2014    source источник


Ответы (2)


Я делаю почти то же самое в приложении Dropwizard для периодического запуска задания. Есть такие проекты, как dropwizard-jobs и dropwizard-quartz, но этот, похоже, отлично подходит для моих простых нужд.

ScheduledExecutorServiceBuilder передает nameFormat в ThreadFactoryBuilder в качестве шаблона для именования потоков. Документы для этого могут быть вам полезны: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/ThreadFactoryBuilder.html#setNameFormat(java.lang.String)

person krisr    schedule 26.10.2014
comment
Ссылка, указанная в этом ответе, больше не существует. Обратитесь к этому обновлена ​​ссылка на документы - person MukeshD; 23.09.2018

С помощью dropwizard-sundial вы можете легко интегрировать облегченную многопоточную библиотеку планирования заданий Java, Солнечные часы и добавьте задания с помощью SimpleTrigger или CronTrigger. В вашем случае вы бы начали с класса, определяющего логику вашей работы с аннотацией SimpleTrigger:

@SimpleTrigger(repeatInterval = 60, timeUnit = TimeUnit.SECONDS)    
public class SampleJob extends com.xeiam.sundial.Job {

  @Override
  public void doRun() throws JobInterruptException {
    // Do something interesting...
  }
}

В файле yaml вашего приложения Dropwizard вам нужно будет определить, какой пакет dropwizard-sundial должен искать аннотированные классы заданий. Ниже приведен пример конфигурации с параметром конфигурации annotated-jobs-package-name вместе с несколькими другими необязательными параметрами для точной настройки планировщика:

sundial:
  thread-pool-size: 10
  shutdown-on-unload: true
  wait-on-shutdown: false
  start-delay-seconds: 0
  start-scheduler-on-load: true
  global-lock-on-load: false
  annotated-jobs-package-name: com.foo.bar.jobs

Кроме того, вы можете асинхронно управлять планировщиком через Curl во время работы приложения, чтобы выполнять такие действия, как блокировка и разблокировка планировщика, запуск, остановка, добавление, удаление заданий и триггеров. Вот несколько примеров:

curl -X POST http://localhost:9090/admin/tasks/locksundialscheduler
curl -X POST http://localhost:9090/admin/tasks/unlocksundialscheduler
curl -X POST "http://localhost:9090/admin/tasks/startjob?JOB_NAME=MyJob"
person herrtim    schedule 02.03.2015