Рассчитать истекшее время до крайнего срока
В JDBC 4.2 и более поздних версиях извлекайте дату и время, используя современные java.time классы.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ); // Likely to be a UTC value.
Получить текущий момент.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC ) ;
Рассчитать прошедшее время.
Duration d = Duration.between( now , odt ) ;
Расписание мероприятия
Используйте современный Executor Framework , а не устаревший класс Timer
. Это особенно верно в среде Servlet или Jakarta.ee (Java EE) .
Определите своего исполнителя, в частности, ScheduledExecutorService
. Для этой задачи нам нужен только один поток.
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
Попросите этого исполнителя подождать определенное время, а затем запустите свой код, чтобы проверить состояние в базе данных.
myExecutorService.schedule( // Tell the executor what you want to run, and when you want it run on your behalf in a background thread.
new Runnable() { … } , // Define task to be executed as a `Runnable`.
d.toSeconds() , // Amount of time to wait until execution. Use self-documenting code rather than a “magic number” such as `86400000`.
TimeUnit.SECONDS // Specify the granularity of time used in previous pair of arguments.
) // Returns a `ScheduledFuture` which you may want to cache.
При желании вы можете получить ScheduledFuture
, возвращаемый этим оператором schedule
. Затем вы можете отслеживать состояние завершения.
В вашем Runnable
получите текущую запись статуса из вашей базы данных. Если необходимо, запланируйте другое выполнение, пересчитав время ожидания, используя новый текущий момент.
Веб-контейнер сервлета
Для веб-контейнера сервлета , такого как Tomcat или Jetty без полного стека Jakarta.ee , применимо вышеупомянутое обсуждение.
Кроме того, вы захотите написать класс, который реализует интерфейс ServletContextListener
, где вы можете настроить и свернуть службу исполнителя. Вам нужно аккуратно разорвать службу executor, чтобы ее фоновый поток не продолжал весело продолжаться долго после завершения работы вашего веб-приложения.
Джакарта EE
Если в полномасштабном стеке Jakarta.ee, таком как Glassfish, эта работа намного проще.
Услуга исполнителя, описанная выше, может быть автоматизирована с настройкой и демонтажем, выполняемым от вашего имени. Используйте утилиты параллелизма, определенные в JSR 236: Утилиты параллелизма для JavaTM EE . Об этом много раз говорилось, поэтому ищите переполнение стека для получения дополнительной информации.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .