Содержание
Интеграция и работа с очередью
В InstantCMS присутствует механизм «очередей». Это набор заданий, которые выполняются последовательно, согласно очередности и приоритета. После успешного выполнения задания, оно удаляется. У задания очереди есть состояния:
- Ожидает выполнения;
- Выполняется;
- Ожидает повторного выполнения;
- Завершено с ошибкой.
Очередь запускается по CRON при помощи системного планировщика. За одно выполнение запускаются 20 задач очереди. Система очередей интегрирована в компоненты Личные сообщения и Подписки.
Работа с очередью
Вся работа с очередью заключается в большинстве случаев в постановке задания в очередь. Обслуживается это системным классом cmsQueue
, в котором все методы статические. Класс можно дополнить/переопределить, в нём используется позднее статическое связывание.
Методы
Все методы класса являются статичными.
cmsQueue::pushOn
pushOn(string $queue, array $data, integer $priority = 1) : integer
Добавляет задание в очередь.
Параметры
Тип | Имя | Описание |
---|---|---|
string | $queue | Имя очереди. |
array | $data | Основные данные очереди. |
integer | $priority | Приоритет задания, по умолчанию 1. |
cmsQueue::pushOnLater
pushOnLater(string $queue, array $data, integer $priority = 1) : integer
Добавляет задачу в очередь с отсрочкой в секундах или по дате.
Параметры
Тип | Имя | Описание |
---|---|---|
mixed | $date | Количество секунд для смещения от текущего времени или полная дата. |
string | $queue | Имя очереди. |
array | $data | Основные данные очереди. |
integer | $priority | Приоритет задания, по умолчанию 1. |
В обоих случаях в массиве $data передаются непосредственно полезные данные очереди, например:
cmsQueue::pushOn('email', array( 'controller' => 'messages', 'hook' => 'queue_send_email', 'params' => array( $to, $letter, $is_nl2br_text ) ));
Массив $data должен содержать ячейки:
- controller - название контроллера (обязательно);
- hook - название хука контроллера (необязательно);
- action - название экшена контроллера (необязательно);
- params - параметры, передаваемые в хук или экшен (необязательно).
Должен быть передан либо hook, либо action. Если будет переданы оба параметра, вызовется сначала хук, потом экшен с одинаковыми параметрами params. Обратите внимание, что при выполнении задания в хук или экшен первым параметром всегда будет передаваться текущая попытка выполнения $attempts
.
Обработка очереди
Само выполнение задания очереди - это стандартный хук или экшен контроллера. При использовании хука, как метода исполнения задания очереди, нет необходимости его описывать в файле манифеста контроллера.
Исполняющий хук или экшен задания строго может возвращать:
- булево true - в этом случае движок будет считать, что задание выполнено успешно и удалит его из очереди;
- булево false - задание выполнено, но будет запущено еще раз, пока не будет достигнуто максимальное кол-во перезапусков (по умолчанию 4);
- любая строка, которая будет означать текст ошибки выполнения.
Выполнение каждого задания заключено в обработку исключений, поэтому все возможные ошибки выполнения отслеживаются и в случае их наличия, будут записаны в задание.
Интеграция списка заданий очереди в админке
Для удобной интеграции списка очереди, используемой в контроллере, необходимо в контроллере админки объявить следующее свойство (на примере контроллера подписок):
public $queue = array( 'queues' => array('subscriptions'), // имена очередей, используемых в контроллере 'queue_name' => LANG_SBSCR_QUEUE_NAME, // общее название этих очередей 'use_queue_action' => true // флаг, разрешающий добавить раздел очередей в админку компонента );
Для заданий очереди будут доступны действия удаления и перезапуска.
К оглавлению раздела "Интеграция"