|
Сервис, исполняющий пользовательские задачи по расписанию (Task Scheduler)
Введение
|
      
Во многих программных системах требуется исполнение некоторых фоновых задач, например, резервное
копирование базы данных по заданному расписанию. Как оказалось, встроенный планировщик
заданий Windows не позволяет автоматизированно управлять (создавать, модифицировать и удалять) заданиями
с требуемой гибкостью в настройках (существуют ограничения на задание расписания) ни при помощи COM-интерфейсов,
ни при помощи утилит командной строки.
     
Поскольку настройка заданий встроенного планировщика полноценно может осуществляться только
через пользовательский интерфейс, мне пришлось разработать собственный Windows-сервис (далее сервис),
который полностью повторяет функциональность встроенного планировщика, однако позволяет программно
управлять списком заданий и их расписаниями.
     
Текущая реализация получает список выполняемых заданий с Web-сервера и при наступлении времени
выполнения задания выполняет его посредством POST-запроса. Однако, если вам необходим
иной способ получения списка заданий и собственно их выполнения, то это элементарно реализуется
путем замены кода, работающего с Web-сервером (написать собственную реализацию двух методов).
|
Алгоритм работы
|
     
При старте сервис некоторым образом, например,
с Web-сервера получает список заданий (в виде XML), в котором указаны название задания,
расписание (в стиле утилиты Cron) и дата последнего запуска. Сервис определяет момент наступления
задания из списка, путем сравнения текущего времени, времени последнего запуска и расписания задания, и
выполняет задание некоторым образом, например, посредством POST-запроса на Web-сервер, в котором передается
название задания. По окончании выполнения задание должно сохранить время завершения своего выполнения,
чтобы в будущем передать его сервису посредством списка заданий. Периодически сервис запрашивает
заново список заданий, реконфигурируя таким образом текущую очередь заданий.
|
Спецификации
|
Список заданий в виде XML
<taskinfo>
<task>
<id>2</id>
<name>systembackup</name>
<min>0</min>
<hour>23</hour>
<day></day>
<month></month>
<last>26.05 23:00</last>
</task>
</taskinfo>
|
Правила задания расписания:
* - повтор задания каждую единицу времени;
7 - повтор задания каждую 7-ю единицу времени;
*/5 - повтор задания через каждые 5 единиц времени;
9-19 - повтор задания каждую единицу времени в течение заданного интервала;
|
Примеры расписаний:
Минуты = */5, Часы = 8-18 - выполнение задания каждые пять минут с 8-ми утра до 18-ти вечера;
Часы = 21, Дни = */3 - выполнение задания в 21 час каждые три дня, каждый месяц;
|
Адаптация
|
     
Для организации работы планировщика по вашему собственному механизму достаточно изменить реализацию
следующих методов: ServiceMain(...) - заменить код, получающий путь к Web-серверу из реестра;
CScheduler::init() - заменить способ получения списка заданий; CScheduledTaskUrl::execute_internal() -
заменить способ выполнения задания, либо создать собственного наследника класса CScheduledTask, в котором
реализовать метод execute_internal(). Программный код написан таким образом, что вы без особого труда
можете вынести часть, реализующую собственно выполнение заданий по расписанию, из всего программного кода и
использовать эти классы в консольных или win-приложениях.
Для успешной компиляции сервиса необходимо установить Platform SDK.
|
|
Сервис вместе с исходным кодом доступен для скачивания на странице Download
|
|