Dropwizard ScheduledExecutorService

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

Документация DW гласит:

"Следует отметить, что среда имеет встроенные методы factory для ExecutorService и ScheduledExecutorService, которые удалось. См. LifecycleEnvironment # executorService и LifecycleEnvironment # scheduleExecutorService для деталей."

Кто-нибудь знает, как реализовать это в 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? BTW runnable dummy:

  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;
      }

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

Ответ 1

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

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

Ответ 2

С dropwizard-sundial вы можете легко интегрировать легкую многопоточную библиотеку планирования заданий Java, Sundial и добавьте задания либо с помощью 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 config вместе с несколькими другими необязательными параметрами для точной настройки планировщика:

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"