Как отслеживать изменение даты в Java - PullRequest
6 голосов
/ 29 марта 2010

У меня есть приложение, которое должно выполнять некоторые действия при каждом изменении даты, скажем, в полночь. Всякий раз, когда дата изменяется, заявление должно быть сказано о том же самом. Буду признателен за любую помощь относительно того, как реализовать функциональность.

Ответы [ 6 ]

7 голосов
/ 29 марта 2010

То, что вы ищете, это планировщик. Quartz , вероятно, является наиболее часто используемым планировщиком в мире Java, хотя Spring имеет некоторые интересные функции планирования, если вы уже используете эту платформу.

Какой бы планировщик вы ни выбрали, вы обычно указываете действие, которое должно произойти (иногда называемое «заданием»), и время, когда оно должно произойти («триггер» в терминологии кварца). В вашем случае вы устанавливаете триггер на запуск каждый день в полночь, а когда он срабатывает, он будет делать все, что вам нужно, как указано в вашей работе.

1 голос
/ 29 марта 2010

В качестве библиотеки вы можете использовать Quartz и настроить запуск триггеров каждую ночь. Я думаю, что простые триггеры должны делать эту работу.

В качестве альтернативы, вы можете реализовать то, что делает Quartz самостоятельно, используя отдельный поток и спать до следующей полуночи.

0 голосов
/ 06 мая 2010

Если вы хотите более легкое решение, чем целая библиотека, я нашел довольно простую реализацию здесь . Это в основном класс Timer.

Когда класс сначала выполняется с помощью метода Start(), код получает дату и время текущего времени, затем получает объект даты и времени полуночи и вычитает 2 раза, чтобы указать время до полуночи. * * 1008

С этим временем он устанавливает интервал таймера и запускает таймер. Теперь, когда интервал достигнут и таймер запускает событие, я сбрасываю таймер, используя тот же процесс. Это установит интервал на 24. По истечении этого таймера он сбрасывается и повторяется бесконечно.

0 голосов
/ 30 марта 2010

Тебе не нужны большие раздутые рамки. Нечто подобное должно работать.

import java.util.*;
public class Midnight {
    public static void main(String args[])  {
        MidnightCowboy mc = new MidnightCowboy();
        mc.start();
        // on with you normal program flow (if any) here
    }
}

class MidnightCowboy extends Thread  {
    static final boolean COWS_COME_HOME = false;
    // Whatever data you need should go here

    public void run()  {
        while (! COWS_COME_HOME)  {
            GregorianCalendar now = new GregorianCalendar();
            long nowMilli = now.getTimeInMillis();
            now.add(Calendar.DAY_OF_MONTH, 1);      // probably an easier way to set the time to the next midnight
            now.set(Calendar.HOUR_OF_DAY, 0);   
            now.set(Calendar.MINUTE, 0);
            now.set(Calendar.SECOND, 0);
            now.set(Calendar.MILLISECOND, 0);
            long midnightMilli = now.getTimeInMillis();
            long delta = midnightMilli - nowMilli;
            System.out.println("Waiting " + delta + " milliseconds until midnight.");
            // How many milliseconds until the next midnight?
            try  {
                sleep(delta);
                doSomething();
            } catch (InterruptedException e)  {
                System.err.println("I was rudely interrupted!");
            }
        }
    }

    void doSomething() {
        // whatever
    }
}
0 голосов
/ 29 марта 2010

Ответ на этот вопрос раньше был Кварц . Это стандарт де-факто для планирования в Java. Это довольно легко использовать, но это немного тяжеловес. Если вас не волнует кластерное планирование или хранение заданий JDBC, кварц может быть излишним.

К счастью, Spring 3.0 поставляется с новыми функциями планирования. Они позволяют выполнять простые типы планирования «делай это каждые 30 секунд» или «делай это каждый день в полночь» без использования кварца. Если вы уже используете пружину, ее довольно легко настроить.

Пример:

<task:scheduler id="scheduler" pool-size="10"/>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="anotherObject" method="anotherMethod" cron="* * 00 * * *"/>
</task:scheduled-tasks>

Это приведет к вызову метода 'anotherMethod' для вашего компонента с именем 'anotherObject' в полночь каждый день. Более подробную информацию можно найти на сайте весны: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

0 голосов
/ 29 марта 2010

Если вы не хотите, чтобы Quartz или какой-либо другой подобный фреймворк, вы просто взяли вместо этого scheduleAtFixedRate Метод ScheduledExecutorService (пример того, как создать егоJavaDoc).

Единственное, о чем вы должны подумать, это как рассчитать начало первого дня.

Редактировать

As Jarnbjoупомянуто: это не переживет переключение Летнего времени и високосные секунды.Так что имейте это в виду, когда используете Executor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...