Задача бизнес-правил (Business Rule Task)
|
Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine |
Задача бизнес-правил используется для синхронного выполнения одного или нескольких правил. Также возможно вызвать Java-код, предоставить рабочее задание для асинхронного выполнения внешним воркером или вызвать логику, реализованную в виде веб-сервисов.
Использование DMN-движка OpenBPM Engine
Вы можете использовать интеграцию DMN-движка OpenBPM Engine для вычисления DMN-решения.
Для этого необходимо указать ключ решения с помощью атрибута camunda:decisionRef.
Дополнительно атрибут camunda:decisionRefBinding определяет, какая версия решения должна быть выполнена.
Допустимые значения:
-
deployment— вычисляет версию решения, которая была развернута вместе с версией процесса, -
latest— всегда вычисляет последнюю версию решения, -
version— позволяет указать конкретную версию для выполнения с помощью атрибутаcamunda:decisionRefVersion, -
versionTag— позволяет указать конкретный тег версии для выполнения с помощью атрибутаcamunda:decisionRefVersionTag.
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision"
camunda:decisionRefBinding="version"
camunda:decisionRefVersion="12" />
По умолчанию для атрибута camunda:decisionRefBinding используется значение latest.
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision" />
Атрибуты camunda:decisionRef, camunda:decisionRefVersion и camunda:decisionRefVersionTag могут быть заданы в виде выражений, которые будут вычисляться во время выполнения задачи.
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="${decisionKey}"
camunda:decisionRefBinding="version"
camunda:decisionRefVersion="${decisionVersion}" />
Результат выполнения решения, также называемый результатом решения (decision result), не сохраняется автоматически как переменная процесса. Его необходимо сохранить в переменную процесса с помощью предопределённого или пользовательского маппинга результата решения.
В случае предопределённого маппинга атрибут camunda:mapDecisionResult указывает, какой маппер необходимо использовать.
Результат маппинга сохраняется в переменную, заданную атрибутом camunda:resultVariable.
Если предопределённый маппер не указан, по умолчанию используется маппер resultList.
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision"
camunda:mapDecisionResult="singleEntry"
camunda:resultVariable="result" />
Подробности о маппинге см. в Руководстве пользователя.
|
Переменная результата не должна иметь имя |
Tenant Id для DecisionRef
При разрешении определения решения для выполнения задача бизнес-правил должна учитывать мультиарендность (multi-tenancy).
Разрешение tenant по умолчанию
По умолчанию для вычисления определения решения используется tenant id вызывающего определения процесса. То есть, если вызывающее определение процесса не имеет tenant id, задача бизнес-правил вычисляет определение решения с использованием заданного ключа и binding без tenant id (tenant id = null). Если вызывающее определение процесса имеет tenant id, будет вычислено определение решения с тем же ключом и тем же tenant id.
Обратите внимание, что tenant id экземпляра процесса по умолчанию не учитывается.
Явное указание tenant
В некоторых ситуациях может потребоваться переопределить поведение по умолчанию и явно указать tenant id.
Атрибут camunda:decisionRefTenantId позволяет явно задать tenant id:
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="TENANT_1">
</businessRuleTask>
Если tenant id неизвестен на этапе проектирования, можно использовать выражение:
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="${ myBean.calculateTenantId(variable) }">
</businessRuleTask>
Также выражение позволяет использовать tenant id экземпляра процесса вместо tenant id определения процесса:
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="${ execution.tenantId }">
</businessRuleTask>
Использование пользовательского движка правил
Вы можете интегрироваться с другими движками правил. Для этого необходимо подключить свою реализацию задачи бизнес-правил аналогично задаче сервиса (Service Task).
<businessRuleTask id="businessRuleTask"
camunda:delegateExpression="${MyRuleServiceDelegate}" />
Использование Delegate-кода
В качестве альтернативы задача бизнес-правил может быть реализована с использованием Java-делегирования, так же как и задача сервиса. Подробнее см. документацию по сервисным задачам.
Реализация как External Task
В дополнение к вышесказанному, задача бизнес-правил может быть реализована с помощью механизма External Task, при котором внешняя система опрашивает движок процессов на наличие задач для выполнения. Подробнее о настройке external task см. в разделе про сервисные задачи.
Расширения OpenBPM Engine
Атрибуты |
camunda:asyncBefore, camunda:asyncAfter, camunda:class, camunda:decisionRef, camunda:decisionRefBinding, camunda:decisionRefTenantId, camunda:decisionRefVersion, camunda:decisionRefVersionTag, camunda:delegateExpression, camunda:exclusive, camunda:expression, camunda:jobPriority, camunda:mapDecisionResult, camunda:resultVariable, camunda:topic, camunda:type, camunda:taskPriority |
Элементы расширений |
|
Ограничения |
Один из атрибутов camunda:class, camunda:delegateExpression, camunda:decisionRef, camunda:type или camunda:expression является обязательным |
Атрибут camunda:resultVariable может использоваться только в сочетании с атрибутом camunda:decisionRef или camunda:expression |
|
Атрибут camunda:exclusive учитывается только в том случае, если атрибут camunda:asyncBefore или camunda:asyncAfter установлен в значение true |
|
Атрибут camunda:topic может использоваться только тогда, когда атрибут camunda:type установлен в значение external. |
|
Атрибут camunda:taskPriority может использоваться только тогда, когда атрибут camunda:type установлен в значение external. |
Дополнительные ресурсы
-
Демонстрация использования Drools в задаче бизнес-правил
Лицензия и атрибуция
Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .
Оригинал документации: https://docs.camunda.org