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"