Модуль "Задачи"
Описание
Модуль core.task выполняет отложенные действия над процессами. Он состоит из двух связанных
частей:
-
справочника Задачи — переиспользуемых определений обработчиков;
-
задач процесса — конкретных запусков выбранного определения для конкретного процесса и времени.
Определение содержит название и один или два варианта реализации: класс TaskHandler и JEXL-скрипт.
Задача процесса хранит процесс, определение, время запуска, конфигурацию, состояние и число повторов.
Один элемент справочника поэтому может породить сколько угодно независимых запусков.
| Часть | Где настраивается | Что хранит |
|---|---|---|
Справочник задач |
Название, класс-обработчик, JEXL-скрипт и признак включения |
|
Задачи процесса |
Вкладка Задачи в карточке процесса, конструктор правил или |
Процесс, задачу из справочника, конфигурацию запуска, плановое время, состояние и попытки |
Исполнитель |
Конфигурация сервера |
Ищет наступившие запуски, выполняет класс или скрипт и меняет состояние задачи процесса |
Это не модуль «Планировщик». Планировщик запускает
периодические серверные работы по маске времени, а core.task хранит разовые запуски,
привязанные к процессам.
|
Общий жизненный цикл выглядит так:
-
Администратор создаёт определение в справочнике и включает его.
-
Пользователь, правило автоматизации или код планирует задачу для процесса.
-
Запуск получает статус
PENDING(В ожидании). -
TaskRunnerпосле наступления планового времени переводит его вIN_PROGRESS(Выполняется) и запускает обработчик. -
Успешный запуск становится
EXECUTED(Выполнено). После ошибки он становитсяERRORи повторяется, пока не исчерпано заданное число повторных попыток. Ожидающий запуск можно перевести вCANCELLED(Отменено).
Подробная работа со списком запусков описана на странице Задачи процесса.
Конфигурация
Конфигурация сервера
| Ключ | Значение по умолчанию | Назначение |
|---|---|---|
|
|
Запускает исполнитель задач процесса. Если ключ выключен, новые задачи сохраняются в
|
|
|
Число потоков исполнителя. Ноль и отрицательные значения заменяются единицей. |
|
|
Пауза между проходами каждого потока. Ноль и отрицательные значения заменяются 60 секундами. |
task.runner.enabled=true
task.runner.pool.size=1
task.runner.delay.seconds=60
Таблицы tasks, process_tasks и task_audit создаются DDL из
core/src/main/java/ru/bgcrm/core/task/db.sql. task_audit хранит историю правок справочника.
Права
Для отображения справочника в меню нужно дать пользователю право .
Кнопки на экране показываются по правам, каждая по своему:
| Право | Что открывает |
|---|---|
Создание задачи |
Плашку "Добавить задачу" |
Редактирование задачи |
Кнопку редактирования на карточке |
Включение и выключение задачи |
Переключатель на карточке. Право одно на оба действия: |
Удаление задачи |
Кнопку удаления на карточке |
Откат изменения и восстановление задачи |
Кнопки "Откатить" в истории и "Восстановить" в разделе "Удалённые" |
Поиск задач, их использования и истории |
Сам список, вкладки "Использование" и "История", раздел "Удалённые". Отдельных прав на них нет: |
Без права бэкенд отказывает в действии, даже если кнопку вызвали в обход интерфейса. Для вкладки карточки процесса используются отдельные права из ветки .
Работа с модулем
Справочник доступен в меню .
Задачи показываются карточками. На карточке видны наименование, id, чип "класс" или "скрипт" и источник: имя класса-обработчика либо первая непустая строка скрипта.
Над списком одно поле поиска и два переключателя:
-
поиск из одних цифр ищет по id, остальное — подстрокой по наименованию, классу и скрипту;
-
переключатель "Все" / "Включённые" / "Выключенные" фильтрует по состоянию;
-
переключатель "Справочник" / "Удалённые" открывает список удалённых задач.
Создание и редактирование
Нажмите Добавить задачу, укажите название и хотя бы один обработчик. Пустое название, название длиннее 255 символов и форма без класса и скрипта не сохраняются.
В поле Класс-обработчик указывается полное имя класса без расширения, например
ru.bgcrm.dyn.ufanet.news.task.NotifyExecutorsTask. Класс должен реализовывать
ru.bgcrm.core.task.executor.TaskHandler и метод execute(id, context).
Кнопка "Выбрать" у поля "Класс-обработчик" открывает список классов динамического кода,
реализующих ru.bgcrm.core.task.executor.TaskHandler, с поиском и группировкой по пакетам.
Классы из сборки в списке не показываются, их имя вводится в поле вручную.
Поле "Скрипт" — редактор кода Monaco: подсветка синтаксиса как у Java, потому что JEXL близок к ней по разметке. По Ctrl+Пробел подставляются объекты контекста задачи.
| Режим Java выбран ещё и потому, что у него нет языкового сервиса: в подсказках остаются только объекты контекста задачи, без браузерных объектов JavaScript. |
Кнопка "Форматировать" над полем приводит скрипт в порядок и работает в два шага:
-
Сначала текст пробуют отформатировать движком JavaScript — он расставляет и отступы, и пробелы вокруг операторов. Результат принимается, только если совпал с исходным текстом по непробельным символам, то есть менялись одни пробелы.
-
Если движок не справился или что-то изменил, отступы расставляются собственным выравниванием: вложенность считается по скобкам, меняются только пробелы в начале строк. Скобки внутри строк и комментариев не учитываются, строки блочных комментариев остаются как есть.
Второй шаг нужен потому, что JEXL — не JavaScript: for (i : list), операторы =~ и !~,
словесные сравнения вроде eq движок не разбирает. Отступ — два пробела,
табуляция заменяется пробелами.
Форматирование сделано кнопкой, а не автоматически при сохранении: автоматический прогон переписал бы отступы во всём старом скрипте при любой правке, и в истории изменений появилась бы запись "изменился весь скрипт".
Если заполнены и класс, и скрипт, исполнитель выбирает класс. Скрипт служит обработчиком только при пустом поле класса.
Скрипт выполняется под системным пользователем в контексте процесса. Помимо стандартного JEXL, ему доступны:
-
context - контекст для получения сервисов;
-
conSet - соединения к БД;
-
processService - сервис для изменения процесса с генерацией событий;
-
parameterService - сервис для изменения параметров с генерацией событий;
-
processParam - параметры изменяющегося процесса;
-
processLink - привязки изменяющегося процесса;
-
user - текущий пользователь;
-
process - изменяющийся процесс;
-
config - конфигурация задачи;
-
tu - утилиты для работы с датами;
-
u - общие утилиты;
-
processTaskService - сервис для работы с задачами процесса;
-
taskService - сервис для работы со справочником задач.
Также добавляются параметры текущего типа процесса: param<ID> содержит отображаемое значение,
а paramValue<ID> — внутреннее значение параметра. Плагины могут расширить контекст через
BuildJexlContextEvent.
Удаление
Кнопка удаления на карточке, удаление подтверждается диалогом.
Удалить задачу нельзя, пока она используется:
-
на неё ссылается правило автоматизации типа процесса — действие Создать задачу или Отменить задачу. В сообщении перечислены типы процессов;
-
у неё остались запуски, которые ещё будут выполнены: в статусе "В ожидании", "Выполняется" либо "Ошибка" с неисчерпанными попытками. В сообщении указано их количество.
Выполненные и отменённые запуски удалению не мешают. При удалении в историю пишется полный снимок полей, поэтому задачу можно восстановить.
| Выключение определения запрещает планировать новые запуски, но не отменяет уже созданные. Существующие задачи процесса продолжают исполняться. Для их отмены используйте вкладку Задачи в карточке процесса или действие конструктора правил Отменить задачу. |
Использование
Клик по карточке раскрывает её, вкладка "Использование" показывает типы процессов, в правилах автоматизации которых настроена задача, с наименованиями правил. У выключенного правила наименование зачёркнуто. Клик по строке открывает настройки типа процесса.
| Использование считается поиском id задачи в json правила, поэтому задача попадает в выборку только по действиям "Создать задачу" и "Отменить задачу". Ссылки на задачу из jexl-скриптов и из динамического кода так не находятся. |
История изменений
Вкладка "История" на раскрытой карточке показывает, кто и когда менял задачу, и разницу по полям: старое значение зачёркнуто, новое выделено. Записываются создание, правка, включение, выключение, удаление и восстановление. Правка, ничего не изменившая, записи не создаёт.
Последнюю правку можно откатить кнопкой "Откатить": поля вернутся к значениям до неё, а сам откат попадёт в историю новой записью. Откатить запись, после которой появились новые, нельзя.
API
Контракт действий справочника описан в HTTP API справочника задач. Для серверного кода предназначен TaskService.