> проекты > компоненты инфраструктуры
Сервис, исполняющий пользовательские задачи по расписанию (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

 Evgeny Savitsky © 2002-2003