Một giải pháp mà tôi đã tìm thấy với Quartz là quay lại một khoảng thời gian cho trình kích hoạt và tính toán thời gian kích hoạt tiếp theo. Bằng cách lặp qua tất cả các trình kích hoạt thời gian gần đây nhất mà một trình kích hoạt nên đã kích hoạt trong quá khứ có thể được xác định.
Tính khoảng cách giữa mỗi bắn:
Date nextFireTime = trigger.getNextFireTime();
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime);
long interval = subsequentFireTime.getTime() - nextFireTime.getTime();
Tìm lần bắn tiếp theo cho một thời gian cho đến khi khoảng thời gian trong quá khứ:
Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
Tôi đã tìm thấy rằng nếu bạn đang sử dụng a CronTrigger
điều này ngăn cản bạn yêu cầu một thời gian cháy trong quá khứ. Để làm việc xung quanh này tôi sửa đổi thời gian bắt đầu, vì vậy đoạn trên trở thành:
Date originalStartTime = trigger.getStartTime(); // save the start time
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval);
trigger.setStartTime(previousPeriodTime);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
trigger.setStartTime(originalStartTime); // reset the start time to be nice
Duyệt qua tất cả các trigger và tìm ra một trong đó là gần đây nhất là trong quá khứ:
for (String groupName : scheduler.getTriggerGroupNames()) {
for (String triggerName : scheduler.getTriggerNames(groupName)) {
Trigger trigger = scheduler.getTrigger(triggerName, groupName);
// code as detailed above...
interval = ...
previousFireTime = ...
}
}
tôi sẽ để nó như một bài tập cho người đọc để cấu trúc lại nó thành các phương thức hoặc các lớp trợ giúp. Tôi thực sự sử dụng thuật toán trên trong trình kích hoạt ủy nhiệm được phân lớp mà sau đó tôi đặt trong một tập hợp được sắp xếp theo thời gian kích hoạt trước đó.
Xin chào Stephen, Cảm ơn bạn đã phản hồi. Tôi đã thêm một chút thông tin trong ghi chú của câu hỏi của mình để giải quyết vấn đề của mình. –