Friendly Enough Expression Language (FEEL)
|
Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine |
| Обратите внимание, что сервера приложений WildFly и JBoss не поддерживают FEEL за пределами DMN-выполнений в Camunda 7. |
Friendly Enough Expression Language (FEEL, "Достаточно дружественный язык аыражений") задается внутри стандарта "Decision Model and Notation" (DMN) силами группы, называемой Object Management Group (OMG). FEEL имеет следующие отличительные особенности:
-
Отсутствие побочных эффектов
-
Простая модель данных с числами, датами, строками, списками и контекстами
-
Простой синтаксис, разработанный для широкой аудитории
-
Трехзначная логика (
true,false,null), основанная на SQL и PMML
Внутри Camunda 7 FEEL может использоваться в различных обстоятельствах для вычисления небольших скриптовых выражений. Следующая таблица предоставляет краткий обзор BPMN элементов, поддерживающих использование FEEL.
| BPMN элемент | Поддержка FEEL |
|---|---|
Язык выражений в виде выражений с условиями |
|
Все задачи, все события, транзакции, подпроцессы и коннекторы |
Язык выражений внутри маппинга параметра |
Язык выражений как значение атрибута или элемента |
|
Язык выражений для определения приоритетности джобы |
По контрасту с Unified Expression Language, FEEL на поддерживает Expression language as delegation code и не предоставляет доступа к бинам и переменным внутренних контекстов. Это обусловлено природой FEEL как языка без побочных эффектов.
Использование языка выражений
Условия
FEEL может использоваться для задания условий для потоков последовательностей и условных событий. Для условных потоков последовательностей должен использоваться элемент conditionExpression потока последовательности. Для условных событий должен использоваться элемент condition условного события. Оба принадлежат к типу tFormalExpression. Текстовое содержимое элемента — это выражение, которое необходимо вычислить.
Внутри выражения доступны переменные выполнения.
Следующий пример показывает, как использовать язык выражений для условия в потоке последовательности:
<sequenceFlow>
<conditionExpression xsi:type="tFormalExpression" language="feel">
test == 'foo'
</conditionExpression>
</sequenceFlow>
Чтобы узнать, как используется язык выражений в условных событиях, см. слудеющий пример:
<conditionalEventDefinition>
<condition type="tFormalExpression">var1 == 1</condition language="feel">
</conditionalEventDefinition>
Параменры inputOutput
С помощью элемента расширения inputOutput от Camunda можно сделать маппинг inputParameter или outputParameter, используя язык выражений.
Далее приведен пример использования языка выражений для маппинга на inputParameter:
<serviceTask id="task" camunda:class="io.openbpm.bpm.example.SumDelegate">
<extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="x">
var1 + var2
</camunda:inputParameter>
</camunda:inputOutput>
</extensionElements>
</serviceTask>
Значение
Различные BPMN элементы позволяют нам задавать их контент на значении атрибута через выражение. См. соответствующий раздел для BPMN в справочнике, где вы найдете более подробные примеры.
Доступность переменных и функций внутри языка выражений
Процессные переменные
Условный поток последовательностей может напрямую проверить значение переменной:
<sequenceFlow>
<conditionExpression xsi:type="tFormalExpression">
${test == 'start'}
</conditionExpression>
</sequenceFlow>
Список типов переменных, поддерживаемых FEEL, можно найти на странице Управление типами в движке FEEL.
Кастомные функции
Camunda 7 предоставляет обертку (wrapper) для FEEL Scala Engine, позволяющую реализовывать кастомные функции, которые могут вызываться в выражениях и унарных тестах. Чтобы узнать больше, посетите страницу Кастомизированные функции движка FEEL.
Встроенные Spin-функции от Camunda
Чтобьы узнать, как использовать Camunda Spin может использоваться вместе с движком Scala FEEL, посетите страницу Интеграция движка FEEL со Spin.
Требования к плагину
Требования к плагину Spin для сложных FEEL-маппингов
При использовании FEEL для задания комплексных входных параметров (таких как вложенные объекты или контексты в маппингах входа/выхода BPMN) the camunda-engine-plugin-spin должен присутствовать в classpath.
Без плагина Spin:
-
Простые значения и неглубокие map-ы все еще могут вычисляться с помощью FEEL.
-
Сложные вложенные контексты (например, map, содержащий другой map) упадут с рантайм-ошибкой, если к ним обратиться из Java-делегатов или других компонентов, ожидающих Java-типов.
-
FEEL выражения, включающие такие структуры, не удастся правильно парсить или маппить.
Пример
Следующий BPMN пример задает вложенный входной параметр с использованием FEEL выражения:
<camunda:inputParameter name="context">
<camunda:script scriptFormat="feel">
{
invoice: {
id: "INV-2024-001",
issueDate: date("2024-04-02"),
dueDate: date("2024-04-16"),
customer: {
name: "Example Corp",
address: "123 Business Rd",
country: "Germany"
}
}
}
</camunda:script>
</camunda:inputParameter>
Чтобы обратиться к этому context как к Map<String, Object> изнутри Java делегата, плагин camunda-engine-plugin-spin должен быть доступен, чтобы вложенная структура могла получить правильный маппинг.
Лицензия и атрибуция
Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .
Оригинал документации: https://docs.camunda.org