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

Потоки последовательностей, условные события

Язык выражений в виде выражений с условиями

Все задачи, все события, транзакции, подпроцессы и коннекторы

Язык выражений внутри маппинга параметра inputOutput

Различные элементы

Язык выражений как значение атрибута или элемента

Все узлы потоков, определения процессов

Язык выражений для определения приоритетности джобы

По контрасту с 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