2010-03-13 4 views
7

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

ответ

9

Вы можете позволить расписанию 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); 
     } 
    } 
} 
+0

Дит это так и работает прекрасно. Благодарю. – rmarimon

+1

@rmarimon: NP :) Просто будьте осторожны, чтобы «RuntimeException» может остановить периодическое выполнение. Я был сожжен этим, поэтому я отредактировал ответ соответственно. –

+0

Я просто изменил его. У меня было это как try {} catch (Exception e) {}, а затем перепланировать. Но, наконец, кажется, что это правильный подход. – rmarimon

1

TimerTask ручка этот случай.

См schedule(TimerTask, Date)

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

2

Quartz был бы хорош, так как вы используете приложение на основе Интернета. Это обеспечит точное планирование по времени, которое вам нужно.

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

Смежные вопросы