Задача бизнес-правил (Business Rule Task)

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Задача бизнес-правил используется для синхронного выполнения одного или нескольких правил. Также возможно вызвать Java-код, предоставить рабочее задание для асинхронного выполнения внешним воркером или вызвать логику, реализованную в виде веб-сервисов.

business rule task

Использование 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" />

Подробности о маппинге см. в Руководстве пользователя.

Переменная результата не должна иметь имя decisionResult, так как сам результат решения сохраняется в переменной с этим именем. В противном случае при сохранении переменной результата будет выброшено исключение.

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: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.

Дополнительные ресурсы

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org