Метод запуска в начале месяца в java

для школьного проекта я должен рассчитать «горячий предмет» сумки для покупок (самый популярный предмет в этом месяце). Но я не знаю, как вызывать метод (getHotItem) каждый первый день месяца. Я уже провел некоторое исследование и узнал о Timer и ScheduleExpressions, но из того, что я узнал, он в основном используется для фиксированного интервала времени (что не относится к месяцам 30 или 31 день)

Есть ли способ вызвать этот метод в определенную дату в будущем (каждое 1-е число месяца)?

Спасибо


person TCode    schedule 17.11.2014    source источник
comment
Создайте программу Java, которая запускается при загрузке, проверяет дату (new Date(), см. stackoverflow.com/questions/9629636/get-todays-date-in-java ), и если день равен 1, сделайте свои расчеты. Удачного кодирования :) -Чарли   -  person Charlie    schedule 17.11.2014
comment
Вероятно, ненужный совет: сохраните последнюю обработанную дату. В противном случае вы рискуете сломаться, чтобы либо пропустить месяц, либо сделать это дважды.   -  person Joop Eggen    schedule 17.11.2014


Ответы (1)


Избегайте Timer класса в сервлетах

При работе в среде веб-приложения не используйте класс Timer. Поищите в StackOverflow, чтобы узнать, почему.

ScheduleExpression

Согласно учебнику по Oracle, ScheduleExpression может быть установлен для первого месяцев. Похоже, этому классу требуется контейнер EJB. EJB является излишним для многих людей, включая меня и мою работу, поэтому я не знаком с этим классом.

ScheduledExecutorService

Другой путь без полного EJB и Java EE — это семейство классов/интерфейсов Executor. См. учебник. В частности, обратите внимание на ScheduledExecutorService.

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

Обязательно прочитайте документ и выполните поиск этого класса в StackOverflow, чтобы узнать больше. Одна хитрость заключается в том, что ваш запланированный код не может генерировать никаких исключений, иначе ScheduledExecutorService молча остановится. Так что поместите try-catch вокруг вашего кода.

Для среды веб-приложений (только сервлеты, или веб-профиль Java EE, или полная версия Java EE) используйте ServletContextListener для обнаружения во время выполнения запуска веб-приложения и, таким образом, запустите свой ScheduledExecutorService. Точно так же вы можете отключиться. Опять же, поищите в StackOverflow, так как это было описано ранее.

Проверяйте ежедневно

Вы можете попытаться рассчитать количество времени до следующего первого месяца, но зачем? Быстрая проверка на сегодняшнюю дату практически не влияет на ваш сервер, значительно упрощает ваш код и позволяет избежать возможных ошибок из-за ваших просчетов. Это совет для реального мира; возможно, целью вашего домашнего задания является вычисление даты.

Еще один практический совет: избегайте классов java.util.Date/.Calendar, так как они, как известно, хлопотны, сбивают с толку и имеют недостатки. Вместо этого используйте либо библиотеку Joda-Time, либо пакет java.time, встроенный в Java 8 (вдохновленный Joda-Time).

person Basil Bourque    schedule 17.11.2014