Создать планировщик на Java

Я создаю функциональность, которая позволит пользователям планировать повторяющиеся и неповторяющиеся задачи. Мне нужно сохранить эти расписания в базе данных и читать активные расписания один раз в день, чтобы увидеть, должны ли они запускаться сегодня.

Я использую Spring/Java. Боюсь, если я сам напишу эту логику, ее будет недостаточно и она будет не такой эффективной, как могла бы быть.

Необходимые настройки расписания аналогичны календарю Outlook, за исключением того, что они касаются времени. (вероятно, проще открыть повторяющееся собрание Outlook, чем прочитать мое исполнение):

  • Фактическая дата
  • каждый N-й день, исходя из даты начала
  • каждый N-й рабочий день, начиная с даты начала
  • каждую N-ю неделю по принципу «один ко многим» (воскресенье, понедельник, вторник и т. д.) в зависимости от даты начала
  • (1-й, 2-й, 3-й, 4-й, последний) (Вс, Пн, Вт и т. д.) каждого N-го месяца на основе даты начала
  • день X каждого месяца y, исходя из даты начала
  • каждый (январь, февраль, март, апрель и т. д.) N-й день каждого года
  • каждый (1-й, 2-й, 3-й, 4-й, последний) (Вс, Пн, Вт и т. д.) из (янв, февраль, март, апрель и т. д.)


Каков простой шаблон для реализации этого? Спасибо за любую помощь


person Jeff    schedule 15.05.2014    source источник
comment
Вы захотите либо заглянуть в ScheduledExecutorService, либо в библиотеку Quartz.   -  person SnakeDoc    schedule 15.05.2014


Ответы (2)


Кварцевый планировщик заданий

То, что вы ищете, может быть легко достигнуто с помощью Quartz Job Scheduler Library .

Это позволяет планировать будущее событие и даже с использованием синтаксиса cron.

Выдержка со страницы проекта:

Что такое библиотека планирования заданий Quartz?

Quartz – это многофункциональная библиотека планирования заданий с открытым исходным кодом, которую можно интегрировать в практически любое Java-приложение — от самого маленького автономного приложения до крупнейшей системы электронной коммерции. Quartz можно использовать для создания простых или сложных расписаний для выполнения десятков, сотен или даже десятков тысяч заданий; задания, задачи которых определены как стандартные компоненты Java, которые могут выполнять практически все, для чего вы их запрограммируете. Планировщик Quartz включает в себя множество функций корпоративного класса, таких как поддержка транзакций JTA и кластеризация.

Quartz можно использовать бесплатно, под лицензией Apache 2.0.

См. Обзор.

См. пример № 3.

person SnakeDoc    schedule 15.05.2014

Весна

Если вы решите написать свою собственную логику и, поскольку вы используете Spring, вы можете использовать некоторые функции, предоставляемые Spring (spring-framework-reference)

Но я никогда этим не пользовался, так как сталкиваюсь со многими трудностями, пытаясь получить именно то, что хочу.

Сервлет QuartzInitializer

Другой способ — использовать встроенный Сервлет QuartzInitializer. Этот метод гораздо более гибкий, поскольку вы можете получить экземпляр планировщика и реализовать свою логику оттуда.

Сервлет, который можно использовать для инициализации Quartz, если он настроен как сервлет с загрузкой при запуске в веб-приложении.

Использование этого сервлета запуска может быть предпочтительнее использования QuartzInitializerListener в некоторых ситуациях, а именно, когда вы хотите инициализировать более одного планировщика в одном приложении.

Вы захотите добавить что-то вроде этого в свой файл WEB-INF/web.xml:

 <servlet>
     <servlet-name>
         QuartzInitializer
     </servlet-name>
     <display-name>
         Quartz Initializer Servlet
     </display-name>
     <servlet-class>
         org.quartz.ee.servlet.QuartzInitializerServlet
     </servlet-class>
     <load-on-startup>
         1
     </load-on-startup>
     <init-param>
         <param-name>config-file</param-name>
         <param-value>/some/path/my_quartz.properties</param-value>
     </init-param>
     <init-param>
         <param-name>shutdown-on-unload</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>wait-on-shutdown</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>start-scheduler-on-load</param-name>
         <param-value>true</param-value>
     </init-param>
 </servlet>

Экземпляр StdSchedulerFactory хранится в ServletContext. Вы можете получить доступ к фабрике из экземпляра ServletContext следующим образом:

 StdSchedulerFactory factory = (StdSchedulerFactory) ctx
            .getAttribute(QuartzFactoryServlet.QUARTZ_FACTORY_KEY);
person Vyrnach    schedule 16.05.2014