Запустите поток Java в определенное время - PullRequest
7 голосов
/ 13 марта 2010

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

Ответы [ 3 ]

9 голосов
/ 13 марта 2010

Вы можете разрешить 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);
        }
    }
}
2 голосов
/ 13 марта 2010

Кварц подойдет, так как ваше приложение доступно через Интернет Это обеспечит точное планирование на основе времени, которое вам нужно.

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

1 голос
/ 13 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...