Компонент Tasks: задачи

Компонент: Tasks: Задачи

Компонент позволяет создавать обработчики cli-задач и настраивать очередь их выполнения. Так же компонент отслеживает процесс выполнения задачи и в случае, если работа задачи была неожиданно прекращена, перезапускает ее.

Обработчик задач. Component.Tasks.HandlerAbstract

Для создании задачи необходимо создать и зарегистрировать обработчик, который будет запущен в указанное время. Обработчик задачи должен быть наследником абстрактного класса Component.Tasks.HandlerAbstract и реализовывать метод process() - данный метод будет выполнен в процессе запуска задачи.

// app/components/Tasks/app/Handler/SendLog.php

Core::load('Component.Tasks.HandlerAbstract');

class Component_Tasks_App_Handler_MyTask extends Component_Tasks_HandlerAbstract
{
	protected function process()
	{
		//реализация метода задачи.
		...
	}
}

Так же, этот абстрактный класс содержит следующие методы который могут быть переопределены и/или использованы в процессе работы задачи:

  • can_start() - вызывается перед запуском задачи, должен возвращать результат проверки возможности запуска.
  • on_start() - вызывается перед началом работы, может быть использован для подготовительных действий.
  • on_stop() - вызывается в момент приостановки задачи, может быть использован для сохранения промежуточных данных. При следующем запуске, выполнение задачи будет продолжено.
  • on_abort() - вызывается в момент прерывания работы задачи. При следующем запуске, выполнение задачи начнется сначала.
  • on_complete() - вызывается когда задача полностью выполнила свою работу.
  • options($name, $value = null, $force_update = false) - с помощью данного метода можно получить и/или установить параметры с которыми была запущена задача.
  • log_system() - системные сообщения. Например, задача запущена, задача остановлена и т.д.
  • log_notice() - простые сообщения, уведомления о ходе работы.
  • log_warning() - предупреждения о непредвиденном сбое в работе. Отправляются при паузе задачи до следующего раза.
  • log_error() - методы регистрируют в журнале сообщения определенного типа.

Обработчику в процессе работы задачи доступно несколько типов временных хранилищ для сохранения промежуточных данных. Данные методы позволяют получать и/или сохранять данные в зависимости от их типа:

  • data($name, $value = null, $force_update = false) - метод предназначен для сохранения данных в сериализованном виде. Размер всех сохраняемых данных в сериализованном виде не должен превышать размер поля типа TEXT. Данный метод можно использовать для хранения каких-либо скалярных значений. Например, можно сохранить номер последней обработанной строки, чтобы в следующей раз начать с этой строки.
  • data_rows($name, $value = null, $force_update = false) - для каждого значения в хранилище будет создана запись с полем типа TEXT. Данный метод можно использовать для хранения данных, размер которых не превышает 65 537 байт.
  • data_blob($name, $value = null, $force_update = false) - для каждого значения в хранилище будет создана запись с полем типа LONGTEXT. Данный метод можно использовать для хранения данных, размер которых не превышает 4294967300 байт. Например, можно сохранить xml, который обрабатывается, чтобы при следующем запуске не запрашивать его.

Параметры методов:

  • $name - ключ с которым будут записаны данные.
  • $value - если передано, то переданные данные будут сохранены.
  • $force_update - флаг, указывающий, стоит ли немедленно сохранить данные в БД.

Регистрация обработчика

Регистрацию обработчика можно произвести несколькими способами:

1. Разместить файл модуля в директории app/components/Tasks/app/Handler/TaskType.php.

2. Указать обработчики в конфигурационном файле компонента app/components/Tasks/app/config/task_handlers.php в виде массива.

return array(
	'task_type' => 'Handler.Module',
);

3. Если регистрацию необходимо произвести в стороннем компоненте, то необходимо реализовать метод task_handler_list(), который должен вернуть массив, аналогичный app/components/Tasks/app/config/task_handlers.php.

4. Или воспользоваться методом add_task_handler() компонента Component.Tasks.

CMS::component('Tasks')->add_task_handler($task_type, 'Handler.Module');

Задачи. Component.Tasks.DB.Task

После того, как обработчик задачи реализован и зарегистрирован в компоненте, можно начинать добавлять сами задачи. Добавлять задачи можно как из административного интерфейса так и из CLI (см. ниже).

Поля которые необходимо указать при добавлении задачи:

  • Обработчик - выбрать имя обработчика из списка зарегистрированных.
  • Главная задача - в этом поле указывается задача, после выполнения которой должна быть запущена текущая задача.
  • Приоритет - приоритет задачи, задачи с более высоким приоритетом будут выполнены ранее.
  • Вес - вес задачи, задачи с более низким весом будут выполнены ранее.
  • Период запуска - в этом поле указывается период запуска в секундах для периодических задач.
  • Дата запуска - дата следующего запуска, с помощью этого поля можно отложить выполнение задачи.
  • Однократная - в случае если задача не предполагает периодического запуска устанавливается эта галка.
  • Параметры задачи - указывается массив каких-либо настроек, необходимых обработчику (см. метод options выше).

Запуск

После добавление задач, в крон необходимо добавить команду запуска менеджера.

*/1 * * * * (cd /path/to/index.php; /path/to/php index.php task_manager process)

CLI

Компонент предоставляет возможность управления задачами из командной строки.

Команды для работы с задачами:

//Добавление/изменение задач

//Параметры
// --type - имя зарегистрированного обработчика
// --name - человеко-понятное название задачи
// --priority - приоритет задачи
// --weight - вес задачи
// --wait_tid - id главной задачи
// --period - период запуска
// --once - однократная или нет
php index.php task add --type --name --period --once [--priority [--weight [--wait_tid]]]
php index.php task update TASK_ID --type --name --period --once [--priority [--weight [--wait_tid]]]

// удаление задачи
php index.php task remove TASK_ID

// Включить/Выключить задачу
php index.php task active TASK_ID
php index.php task inactive TASK_ID

// Просмотреть список задач
php index.php task list_view

Команды для работы с менеджером задач:

//запуск менеджера
php index.php task_manager process

//Запуск выполнения задачи TASK_ID
php index.php task_manager run TASK_ID

//Получение списка процессов запущенных задач
php index.php task_manager list_view

//остановка задачи с id процесса TASK_MGR_ID
php index.php task_manager stop TASK_MGR_ID

// прерывание работы задачи с id процесса менеджера TASK_MGR_ID
php index.php task_manager abort TASK_MGR_ID

Оповещение по e-mail

В компоненте реализован обработчик задачи, который рассылает логи по e-mail. Для того чтобы запустить этот механизм необходимо:

1. Создать задачу с типом SendLog.

2. При добавлении своих задач в поле параметры задачи необходимо добавить массив вида:

email_observers = {
	LOG_LEVEL = {
		0 = email1@email.ru
		1 = email2@email.ru
		2 = email3@email.ru
	}
}

Где LOG_LEVEL является битовой маской из констант компонента:

  • LOG_STATUS_SYSTEM = 1 - системные сообщения
  • LOG_STATUS_NOTICE = 2 - обычные уведомления
  • LOG_STATUS_WARNING = 4 - предупреждения
  • LOG_STATUS_ERROR = 8 - критические ошибки

И определяет какие виды сообщений отправлять указанным получателям. Например, LOG_LEVEL=12 означает, что на указанные адреса будут высылаться только предупреждения и ошибки.

20.02.2015
Все статьи