2013-09-29 32 views
5

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.expression0 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. 
+0

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

Trả lời

3

Câu trả lời ngắn gọn là bạn không thể với tùy chọn cron. Độ phân giải của các biểu thức cron là thứ hai do đó nó sẽ làm tròn đến giây gần nhất. Bạn có thể đảm bảo rằng nó xảy ra ít nhất là sau thời gian cụ thể nhưng không chính xác trên đó với cron.

Đặt cược tốt nhất của bạn là triển khai Trigger của riêng bạn. Giao diện Trigger có một phương thức trả về java.util.Date cho lần thực thi tiếp theo (tính bằng mili giây). Từ đó, bạn có thể đăng ký tác vụ và trình kích hoạt như được hiển thị trong tài liệu tại đây: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html

0

Cron sẽ bỏ qua mili giây và hàm ý chỉ trong vòng một giây, giả sử không có bất kỳ vấn đề thời gian nào khác tải trên hệ thống.

Bạn có hai lựa chọn: 1. Bắt đầu công việc cron một vài giây sau giờ 2. Thay đổi tính giờ để cho phép công việc kích hoạt sớm.

Trong số hai, đầu tiên là dễ nhất và tôi sẽ không gọi nó là bất kỳ tin tặc nào hơn là cho phép làm tròn các vấn đề khi sử dụng số dấu phẩy động.

1

Nếu bạn định chèn giá trị giờ chính xác, tôi nghĩ giải pháp tốt hơn là tính giờ dựa trên lịch biểu cron ít được dự đoán hơn. Miễn là nó rơi trong vòng một giây, bạn chỉ có thể nhận được thời gian hiện tại và chuyển đổi nó đến giờ gần nhất, và sau đó lấy được giá trị giờ từ đó. Bạn cũng có thể thêm cảnh báo/cảnh báo để cho bạn biết liệu cron có hoạt động không bình thường hay không bằng cách lắng nghe các tác vụ bắt đầu trễ hơn một phút hoặc trễ 10 phút, v.v.

Mặc dù bạn có thể điều chỉnh lịch biểu cron thay thế, Tôi cảm thấy đó là một hack hơn là xử lý nó trong mã kể từ khi bạn đang xấp xỉ một xấp xỉ tại thời điểm đó. Bạn có nhiều quyền kiểm soát trong mã để xử lý nhiều hơn một trăm mili giây đơn giản bù đắp

Các vấn đề liên quan