Tôi đã thiết lập Spring's @Scheduled
với một biểu thức cron cho mỗi giờ như bên dưới nơi trend.olap.local.loading.cron.expression
là 0 0 * * * ?
.Công việc cron được lập lịch của Spring được kích hoạt một vài phần nghìn giây trước thời gian được lên lịch
@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);
}
}
Ở đây ý định của tôi là lấy giá trị giờ từ ngày và giờ hiện tại và chuyển nó sang phương thức thực thi.
Về cơ bản tôi đang dùng hiện nay một giờ trừ để lúc 17:00, giá trị giờ nên 16.
Nhưng nếu bạn nhìn thấy các bản ghi, giá trị giờ là 15. Điều này là do Scheduler chạy ở khoảng 16: 59: 59,831. Xem nhật ký log4j bên dưới. Có vẻ như công việc cron đang làm tròn ra mili giây và được kích hoạt một vài phần nghìn giây trước 17: 00: 00,000.
Vì lý do này, tôi nhận được các giá trị sai và trường hợp kinh doanh của tôi không thành công.
Làm cách nào để làm cho cron chạy chính xác ở mili giây của mili giây cho mỗi giờ, thay vì vài mili giây trước đó?
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.
Một giải pháp là đặt Thread.sleep (1000) bên trong phương thức loadHoulyDataToLocalOlap() ngay từ đầu. Có giải pháp nào tốt hơn thế này không? – PShetty