2016-06-29 4 views
0

Я использовал солнечные часы для планирования работы в моем проекте dropwizard. Я заметил, что каждый раз, когда он планирует задание, он создает новый объект запланированной задачи. Разве это не очень плохой дизайн. С другой стороны, таймер java, который планирует TimerTask, просто создает объект один раз и вызывает метод запуска в каждом расписании.Библиотека солнечных батарей Dropwizard каждый раз создает новый экземпляр объекта-графика. Можем ли мы это избежать. Что-то вроде java timer

+0

Почему бы не использовать управляемый интерфейс DW? – pandaadb

+0

Я не знаю об этом. О каком из них вы говорите? –

+0

Я выложу альтернативный подход к вашей проблеме, используя управляемый подход с dropwizad. – pandaadb

ответ

0

поэтому способ решить вашу проблему с помощью 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

+0

Это отличный способ сделать что-то. Спасибо за ответ. –

+0

вы можете согласиться с ответом, если считаете, что это правильно;) С помощью такого же подхода вы могли бы создать свою собственную фреймворк, чтобы имитировать фреймворк, который вы пытались использовать (например, использовать cron-подобный синтаксис для выполнения ваших запросов) – pandaadb

 Смежные вопросы

  • Нет связанных вопросов^_^