Я использовал солнечные часы для планирования работы в моем проекте dropwizard. Я заметил, что каждый раз, когда он планирует задание, он создает новый объект запланированной задачи. Разве это не очень плохой дизайн. С другой стороны, таймер java, который планирует TimerTask, просто создает объект один раз и вызывает метод запуска в каждом расписании.Библиотека солнечных батарей Dropwizard каждый раз создает новый экземпляр объекта-графика. Можем ли мы это избежать. Что-то вроде java timer
ответ
поэтому способ решить вашу проблему с помощью DW - использовать управляемый подход. DW предоставляет интерфейс под названием Managed, который вы можете зарегистрировать на причале. Jetty позаботится о том, чтобы начать и остановить их, и у вас есть полный контроль над выполнением ваших задач. Используя структуру DI, вы можете определить свои собственные правила выполнения.
Представьте себе следующий класс:
public class MessageTask implements Managed, Runnable {
private static final Logger log = Logger.getLogger(MessageTask.class);
private ScheduledExecutorService mainRunner = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder().setDaemon(true).setNameFormat("task-%d").build());
// injected by DI or set programatically
@Inject
private long delay;
@Inject
private long period;
@Override
public void start() throws Exception {
mainRunner.scheduleAtFixedRate(this, delay, period, TimeUnit.MILLISECONDS);
}
@Override
public void stop() throws Exception {
mainRunner.shutdown();
}
@Override
public void run() {
try {
runInner();
} catch (Exception e) {
log.error("Error executing task", e);
}
}
private void runInner() throws Exception {
// do your timer task work here
}
}
Это является управляемой задачей. Регистрация его с помощью DW приведет к тому, что фреймворк вызовет метод start и stop при запуске или остановке сервера.
Вы определить (по расписанию Исполнитель) в пределах класса и реализовать его как Runnable (создание не множественного объекта) в
На старте вы запланировать задачу с сконфигурированной задержки и период вам требуется.
На остановке вы остановите свой планировщик.
Threadpool - это поток деамонов, поэтому он не будет блокировать остановку JVM.
Вам нужно поймать исключение в методе run, потому что структура исполнительного механизма threadpool иначе молча удалит задачу после исключения.
Метод runInner() выполнит любую требуемую логику.
Конфигурация может быть сделана с помощью рамки DI (я использую guicey, который интегрирует Guice и DW) или Programatically см: http://www.dropwizard.io/0.9.2/docs/manual/core.html#managed-objects
Это, конечно, не реально ответить на ваш вопрос - это лишь альтернативное решение , Я, к сожалению, никогда не работал с вашей картой, поэтому я не могу прокомментировать ее. Но выше это легкое решение, которое не требует каких-либо других фреймворков, которые нужно вложить в ваше приложение.
Я надеюсь, что это даст некоторые из них.
Artur
Это отличный способ сделать что-то. Спасибо за ответ. –
вы можете согласиться с ответом, если считаете, что это правильно;) С помощью такого же подхода вы могли бы создать свою собственную фреймворк, чтобы имитировать фреймворк, который вы пытались использовать (например, использовать cron-подобный синтаксис для выполнения ваших запросов) – pandaadb
Почему бы не использовать управляемый интерфейс DW? – pandaadb
Я не знаю об этом. О каком из них вы говорите? –
Я выложу альтернативный подход к вашей проблеме, используя управляемый подход с dropwizad. – pandaadb