Выполните поток Java в определенные времена

У меня есть веб-приложение, которое синхронизируется с центральной базой данных четыре раза в час. Процесс обычно занимает 2 минуты. Я хотел бы выполнить этот процесс как поток в X:55, X:10, X:25 и X:40 так, чтобы пользователи знали, что в X:00, X:15, X:30 и X:45 у них есть чистая копия базы данных. Это примерно управляет ожиданиями. Я прошел исполнителя в java.util.concurrent но планирование, покончили scheduleAtFixedRate то, которому я верю, не обеспечивает гарантии о том, когда это на самом деле выполняется с точки зрения часов. Я мог использовать первую задержку с запуском Runnable так, чтобы первый был близко ко времени запуска и расписанию в течение каждых 15 минут, но кажется, что это, вероятно, отличалось бы вовремя. Существует ли более легкий способ запланировать поток для выполнения за 5 минут до каждого часа четверти?

7
задан Ricardo Marimon 13 March 2010 в 03:19
поделиться

3 ответа

Вы можете позволить 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);
        }
    }
}
9
ответ дан 6 December 2019 в 21:12
поделиться

Quartz подойдет, поскольку ваше приложение является веб-приложением. Он предоставит вам необходимое подробное планирование на основе времени.

Quartz - это полнофункциональная служба планирования заданий с открытым исходным кодом, которую можно интегрировать или использовать вместе практически с любой Java EE или Java SE {{1 }} приложение - от самого маленького автономного приложения до крупнейшей системы электронной коммерции. Quartz можно использовать для создания простых или сложных расписаний для выполнения десятков, сотен или даже десятков тысяч заданий; задания, задачи которых определены как стандартные компоненты Java , которые могут выполнять виртуально все, что вы можете их запрограммировать. Quartz Scheduler включает множество {{1} } функции корпоративного класса, такие как транзакции JTA и кластеризация.

2
ответ дан 6 December 2019 в 21:12
поделиться

TimerTask обрабатывает этот случай.

См. расписание (TimerTask, Date).

Если вы не хотите постоянно планировать задания, вы можете изучить инструмент планирования заданий, например Quartz .

1
ответ дан 6 December 2019 в 21:12
поделиться