Механизм Правил
8 января 2025 г.Около 3 минCoreRule
По приходу измерения, проверяется участвует ли этот параметр каких либо правилах.
Для каждого правила, в котором участвует параметр:
- проверяется заблокировано ли правило, если заблокировано - дальше обработка по нему не идет;
- проверяется серверное оно или выполняется на EDGE, если не серверное - дальше обработка по нему не идет;
- проверяется заблокировано ли правило на этом контроллере, если заблокировано - дальше обработка по нему не идет;
Обработка правила
- Модуль engine получает данные о Правиле.
- Загружает из БД связанное с задачей правило по его идентификатору - если правило не найдено завершает выполнение.
- Загружает из БД связанный с задачей контроллер по его идентификатору - если не найден завершает выполнение.
3.1 Выполняет проверки что правило по прежнему не заблокировано, серверное и не заблокировано на контроллере (что не произошло изменений с момента отправки его в обработку). - Загружает из БД связанные с правилом измеряемые параметры.
- Если параметры содержат хотя бы один заблокированный параметр - выполнение завершается.
- Если параметры содержат хотя бы один параметр в недостоверном статусе - выполнение завершается.
- Загружает из БД связанные с правилом вычисляемые параметры.
- Если параметры содержат хотя бы один заблокированный параметр - выполнение завершается.
- Если параметры содержат хотя бы один параметр в недостоверном статусе - выполнение завершается.
- Выполняется Триггер с подставленными в него значениями параметров.
- Если в результате выполнения Триггера получено логическое FALSE - выполнение завершается (значит правило не сработало и ничего делать не нужно).
- Выполняется проверка расписания правила, если расписание задано и текущий момент времени не попал в расписание (правило не должно срабатывать по расписанию) - выполнение завершается.
- Проверить, задана ли задержка на исполнение Действий.
- Если есть задержка, проверить, есть ли в хранилище запись для данного правила .
- Если запись есть - завершить выполнение, если нет - добавить запись, в качестве времени выполнения
- Если правило сработало, оно без задержки и соответствует расписанию - для каждого его действия отправляются данные в шину на обработку для применения его уставок. Так же отправляется событие E2017 о срабатывании правила.
Обработка цепочки правил
модуль periodic.
- Задание выбирает из хранилища все записи об отложенном выполнении серверных правил (ruleId, controllerId, execTime).
- Для записей, где время execTime менее текущего (пришло время выполнять) - данные о всех Действиях отправляются в шину на исполнение и удаляется запись из хранилища.
модуль engine
- Из шины вычитываются данные, производят проверку по всем условиям возможности применения уставки (что контроллер есть, что правило не заблокировано, что параметр на который действует уставка не уделан и не в ручном управлении, что время его последнего значения не более времени выполнения уставки (не имеет более свежее чем уставка значение), что устанавливаемое значение отличается от текущего).
- Если применить Действие нельзя, то выходим из алгоритма, если все условия соблюдены, то отправляются данные об уставке в шину на исполнение, формируется 4006 событие и проверяется наличие следующего шага в Дейсвиях
- Если в action_condition есть следуещие шаги (RuleAction.id = action_condition.owner_action_id), то в очередь ActionCondition отправляются данные сondition, condition_action_id с параметром задержки в очереди delay.
- Модуль engine по подписке получает данные из шины и проверяет условие.
- Если условие выполняется (true), либо не заданы, то в шину помещаются данные о следующем Действии и алгоритм переходит на шаг 2).
Общая схема процесса обработки правил

Процесс обработки Глобальных Правил
Обработка правил в модуле engine
По приходу измерения выполняются следующие действия:
- Вычисляются идентификаторы измерений;
- Проверяется участвует ли параметр в каких либо глобальных правилах. Для этого используется кэш в redis, в котором хранятся данные .
- Для каждого правила, в котором участвует параметр:
- проверяется заблокировано ли правило , читается из БД, если заблокировано - дальше обработка по нему не идет;
- в шину отправляется карта – идентификатор глобального правила, time – время измерения { globalRuleId ,time};
- обработка сообщений из шины осуществляется стандартным способом обработки jms сообщений на 6 нитях.
Основной процесс выполнения правила из очереди GlobalRuleExec
- Читается правило по идентификатору из сообщения, если правила нет процесс далее не идет;
- Для Правила читаются списки параметров, если Правило содержит хоть один заблокированный параметр, выполнение прекращается;
- Читаются списки CDP и CCP из redis, если правило содержит хоть один параметр имеющий неопределенное состояние (недостоверное), выполнение прекращается;
- На основании значений из редиса делаются вставки значений параметров в выражение условия правила и javascript’том выполняется условие (используются стандартные сервисы выполнения выражений);
- Если результат выражения правила false, выполнение прекращается
- Читаются все действия глобальных правил .
Для каждого действия выполняется:
- Читается представление связанного параметра из redis, если значение параметра связанного с действием установлено позже момента срабатывания правила, менять его не нужно; такая ситуация может произойти например в случае когда срабатывание правил вызвано приходом на актуальных архивных данных из прошлого, выполнение действия дальше не идет.
- Далее, как в выполнении условия, читаются списки параметров из БД redis, участвующие в выражении
- вычисление действий выполняется стандартными сервисами вычислений значений
- Если вычисленное значение отличается от текущего, тогда отправляется новое значение в шину.
- отправляется событие 4006 в шину с текстом сообщения <идентификатор параметра>=значение, global rule <идентификатор>.