2015-11-13 8 views
1

Я хотел бы запланировать периодическую задачу, выполняемую каждые X часов. У меня есть служба, написанная на Java, и я думал создать длинный фоновый поток, который работает вечно до тех пор, пока служба будет работать. Как я могу гарантировать, что мы выполняем задачу один раз каждые X часов? Должен ли я беспокоиться о том, что часы у меня на ходу? Я знаю, что частота тиков часов может измениться, если процессоры работают.Планирование периодических задач и дрейфа часов

Редактировать: Я думал о добавлении компонента в конфигурацию пружины, чтобы развернуть поток, который будет периодически выполнять мою задачу.

+1

Насколько важно, чтобы задача была запущена в течение часа? Или он выполняется каждые 60 минут и сколько времени приемлемо между ними (например, нормально ли исполнять в момент времени 0 минут, время 59.9 минут и время 120.3 минут)? –

+0

Еще один фон - задачу не нужно запускать в час. У нас есть SLA для обновления отчета один раз каждые 24 часа, поэтому, если примерно каждые 24 часа (выключение на несколько секунд или даже на пару минут является приемлемым), нам нужно отпустить пакет запросов на какую-то услугу. – mewsicalcat

+0

Учитывая, что мы заботимся только об истекшем времени между задачами, нужно ли перекосить часы? – mewsicalcat

ответ

3

Java предоставляет класс java.util.Timer, который предназначен для выполнения задачи в фоновом потоке. Одним из режимов работы является «повторное выполнение с регулярными интервалами». Существуют методы фиксированной задержки и фиксированной скорости, которые можно использовать в зависимости от ваших конкретных потребностей.

Java 5 добавил класс java.util.concurrent.ScheduledThreadPoolExecutor, который более гибкий, чем Timer, но также предлагает методы выполнения с фиксированной задержкой и фиксированной скоростью.

Если вам нужны такие точные сроки, что они не подходят, я не уверен, что Java является подходящим решением. Вы начали бы входить в систему реального времени. На данный момент вы, вероятно, должны искать другие варианты.

0

Если вы беспокоитесь, напишите тестовый процесс и запустите его на целевой платформе. Используя функцию, которую вы планируете использовать для реального процесса (например, ScheduledExecutorService), планируйте задачу для регистрации времени хоста каждые 24 часа. Если хост не использует NTP для синхронизации своих часов, возможно, вы также можете позвонить в веб-службу учета времени и занести в нее журнал. Через несколько дней у вас должно быть хорошее представление о том, нужен ли вам метод для коррекции дрейфа.

Я предполагаю, что встроенный планировщик будет точным до менее чем в секунду в день.

+0

Хорошая идея! Лучший способ узнать, будет ли это даже проблемой, - это проверить его сам. Спасибо :) – mewsicalcat

+0

@mewsicalcat Точность и разрешение таймера зависит от системы. Я бы не стал доверять малине Pi без какого-либо тестирования. Для реального сервера я бы не подумал. – erickson