У меня есть веб-приложение, которое синхронизируется с центральной базой данных четыре раза в час. Процесс обычно занимает 2 минуты. Я хотел бы выполнить этот процесс как поток в X:55, X:10, X:25 и X:40 так, чтобы пользователи знали, что в X:00, X:15, X:30 и X:45 у них есть чистая копия базы данных. Это примерно управляет ожиданиями. Я прошел исполнителя в java.util.concurrent
но планирование, покончили scheduleAtFixedRate
то, которому я верю, не обеспечивает гарантии о том, когда это на самом деле выполняется с точки зрения часов. Я мог использовать первую задержку с запуском Runnable
так, чтобы первый был близко ко времени запуска и расписанию в течение каждых 15 минут, но кажется, что это, вероятно, отличалось бы вовремя. Существует ли более легкий способ запланировать поток для выполнения за 5 минут до каждого часа четверти?
Вы можете позволить Runnable запланировать свой «следующий запуск».
Например,
class Task implements Runnable {
private final ScheduledExecutorService service;
public Task(ScheduledExecutorService service){
this.service = service;
}
public void run(){
try{
//do stuff
}finally{
//Prevent this task from stalling due to RuntimeExceptions.
long untilNextInvocation = //calculate how many ms to next launch
service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS);
}
}
}
Quartz подойдет, поскольку ваше приложение является веб-приложением. Он предоставит вам необходимое подробное планирование на основе времени.
Quartz - это полнофункциональная служба планирования заданий с открытым исходным кодом, которую можно интегрировать или использовать вместе практически с любой Java EE или Java SE {{1 }} приложение - от самого маленького автономного приложения до крупнейшей системы электронной коммерции. Quartz можно использовать для создания простых или сложных расписаний для выполнения десятков, сотен или даже десятков тысяч заданий; задания, задачи которых определены как стандартные компоненты Java , которые могут выполнять виртуально все, что вы можете их запрограммировать. Quartz Scheduler включает множество {{1} } функции корпоративного класса, такие как транзакции JTA и кластеризация.
TimerTask
обрабатывает этот случай.
См. расписание (TimerTask, Date).
Если вы не хотите постоянно планировать задания, вы можете изучить инструмент планирования заданий, например Quartz .