У меня есть настройка Spring @Scheduled
с выражением cron для каждого часа, как показано ниже, где trend.olap.local.loading.cron.expression
- 0 0 * * * ?
.Задача Spring's @Scheduled cron запускает несколько миллисекунд до запланированного времени
@Scheduled(cron = "${trend.olap.local.loading.cron.expression}")
public void loadHoulyDataToLocalOlap() {
try {
// To calculate prev hour;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, -1);
Date date = cal.getTime();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Loading hourly data into local olap :" + date
+ ", and hour :" + hour);
}
dataIntegrationProcessor.loadHourlyDataToLocalOlap(hour);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Loading hourly data into local olap :" + date
+ ", and hour :" + hour + " Completed.");
}
} catch (Exception e) {
LOGGER.error("Error occured at loadHoulyDataToLocalOlap", e);
}
}
Здесь я намерен принять значение часа с текущей даты и времени и передать его методам исполнителя.
В основном я беру текущий час минус один, так что в 17:00, час значение должно быть 16.
Но если вы видите, журналы, час значение 15. Это происходит потому, что планировщик побежал около 16: 59: 59,831. См. Журналы log4j ниже. Похоже, что задание cron округляет миллисекунды и срабатывает за несколько миллисекунд до 17: 00: 00 000.
Из-за этого, я получаю неправильные значения, и мой деловой случай терпит неудачу.
Как сделать запуск cron ровно в нулевые миллисекунды на каждый час, а не на несколько миллисекунд раньше?
DEBUG 2013-09-29 16:59:59,831 (TrendScheduler.java loadHoulyDataToLocalOlap:57) - Loading hourly data into local olap :Sun Sep 29 15:59:59 IST 2013, and hour :15
DEBUG 2013-09-29 16:59:59,831 (DataIntegrationProcessor.java loadHourlyDataToLocalOlap:57) - Loading hourly data for hour :15
INFO 2013-09-29 17:00:00,054 (KettleJobExecutor.java executeJob:73) - Job (24hr_populate_hour_data_job.kjb) executed successfully
DEBUG 2013-09-29 17:00:00,054 (TrendScheduler.java loadHoulyDataToLocalOlap:64) - Loading hourly data into local olap :Sun Sep 29 15:59:59 IST 2013, and hour :15 Completed.
Одним из решений является установка метода Thread.sleep (1000) внутри loadHoulyDataToLocalOlap() в начале. Есть ли лучшее решение, чем это? – PShetty