2012-04-18 29 views
10

Tôi đang phát triển một dịch vụ giả sử bắt đầu mỗi giờ lặp lại chính xác vào giờ (1:00 PM, 2:00 PM, 3:00 PM, v.v.).Cách lên lịch công việc để bắt đầu mỗi giờ

Tôi đã thử làm theo nhưng nó có một vấn đề mà lần đầu tiên tôi phải chạy chương trình chính xác lúc bắt đầu giờ và sau đó lịch trình này sẽ lặp lại nó.

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleWithFixedDelay(new MyTask(), 0, 1, TimeUnit.HOURS); 

Bất kỳ đề xuất nào để lặp lại công việc của tôi bất kể khi nào tôi chạy chương trình?

Kính trọng, Imran

Trả lời

10

Tôi cũng sẽ đề xuất Quartz cho việc này. Nhưng đoạn mã trên có thể được thực hiện để chạy đầu tiên vào đầu giờ bằng cách sử dụng tham số initialDelay.

Calendar calendar = Calendar.getInstance(); 
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleAtFixedRate(new MyTask(), millisToNextHour(calendar), 60*60*1000, TimeUnit.MILLISECONDS); 



private static long millisToNextHour(Calendar calendar) { 
    int minutes = calendar.get(Calendar.MINUTE); 
    int seconds = calendar.get(Calendar.SECOND); 
    int millis = calendar.get(Calendar.MILLISECOND); 
    int minutesToNextHour = 60 - minutes; 
    int secondsToNextHour = 60 - seconds; 
    int millisToNextHour = 1000 - millis; 
    return minutesToNextHour*60*1000 + secondsToNextHour*1000 + millisToNextHour; 
} 
+1

chúng tôi sẽ sử dụng scheduleWithFixedDelay hoặc scheduleAtFixedDelay? tôi nghĩ chúng ta sẽ sử dụng scheduleAtFixedDelay. nếu không nó sẽ thêm thời gian thực hiện trong sự lặp lại. – ImranRazaKhan

+2

có. trong trường hợp của bạn, bạn nên sử dụng scheduleAtFixedRate. Đã cập nhật câu trả lời – krishnakumarp

7

Nếu bạn có thể đủ khả năng để sử dụng một thư viện bên ngoài, sau đó Quartz cung cấp rất linh hoạt và dễ dàng để sử dụng chế độ kế hoạch. Ví dụ: chế độ cron phải hoàn hảo cho trường hợp của bạn. Dưới đây là một ví dụ đơn giản của lịch một số Job được thực hiện mỗi giờ:

quartzScheduler.scheduleJob(
    myJob, newTrigger().withIdentity("myJob", "group") 
         .withSchedule(cronSchedule("0 * * * * ?")).build()); 

Có một cái nhìn tại tutorialexamples để tìm mà công thức phù hợp với thị hiếu của bạn. Họ cũng cho thấy cách xử lý lỗi.

1

Nếu bạn đang sử dụng lò xo trong dịch vụ của mình, bạn có thể sử dụng chú thích dựa trên chú thích @Schedule chú thích biểu thức cron dưới dạng tham số hoặc độ trễ bằng mili giây, chỉ cần thêm chú thích này ở trên phương thức bạn muốn thực thi và phương pháp này sẽ được thực hiện. Hãy tận hưởng ...........

5

Phương pháp millisToNextHour trong krishnakumarp của answer có thể được làm nhỏ gọn hơn và đơn giản trong Java 8, trong đó sẽ dẫn đến đoạn mã sau:

public void schedule() { 
    ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(); 
    scheduledExecutor.scheduleAtFixedRate(new MyTask(), millisToNextHour(), 60*60*1000, TimeUnit.MILLISECONDS); 
} 

private long millisToNextHour() { 
    LocalDateTime nextHour = LocalDateTime.now().plusHours(1).truncatedTo(ChronoUnit.HOURS); 
    return LocalDateTime.now().until(nextHour, ChronoUnit.MILLIS); 
} 
Các vấn đề liên quan