Встраивание движка DMN

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

Движок DMN от Camunda может использоваться как библиотека внутри кастомизированного приложения. Чтобы этого добиться, добавьте артефакт camunda-engine-dmn в classpath приложения и затем сконфигурируйте и соберите экземпляр движка решений. Этот раздел документации предоставляет требуемые координаты Maven, которые необходимы, чтобы добавить движок DMN как зависимость к вашему проекту. Затем он объясняет, как сконфигурировать и собрать новый экземпляр движка DMN.

Координаты Maven

Движок DMN от Camunda добавлен к Maven Central.

Начните с импорта camunda-engine-dmn BOM, чтобы гарантировать корректное управление зависимостью.

Далее, включте артефакт camunda-engine-dmn в раздел dependencies.

Сборка движка DMN

Чтобы собрать новый движок DMN, создайте конфигурацию движка. Сконфигурируйте ее, как требуется и затем соберите новый движок DMN по этой конфигурации.

// create default DMN engine configuration
DmnEngineConfiguration configuration = DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// configure as needed
// ...

// build a new DMN engine
DmnEngine dmnEngine = configuration.buildEngine();

Конфигурация движка DMN

Этот раздел дает лучшее представление о конфигурировании встроенного движка DMN. В том случае, если вы хотите использовать движок DMN как часть движка BPMN, обратитесь к разделу Конфигурация движка DMN руководства пользователя, чтобы узнать, как конфигурировать под этот сценарий.

Слушатели события оценки таблицы решений

Конфигурация движка DMN позволяет вам добавлять кастомизированный слушатель события оценки таблицы решений. Такого рода слушатель получает уведомление после того, как произошла оценка таблицы решений. Он получает событие оценки, которое содержит результат оценки. Вы можете решить, должен ли этот слушатель получать уведомление до или после слушателей по умолчанию.

// create default DMN engine configuration
DmnEngineConfiguration configuration = DmnEngineConfiguration
    .createDefaultDmnEngineConfiguration();

// instantiate the listener
DmnDecisionTableEvaluationListener myListener = ...;

// notify before default listeners
configuration.getCustomPreDecisionTableEvaluationListeners()
  .add(myListener);

// notify after default listeners
configuration.getCustomPostDecisionTableEvaluationListeners()
  .add(myListener);

Специализированный слушатель события оценки является сборщиком метрик, который записывает число выполненных элементов решения. Эта метрика может использоваться для мониторинга рабочей нагрузки движка решений.

// create default DMN engine configuration
DmnEngineConfiguration configuration = DmnEngineConfiguration
    .createDefaultDmnEngineConfiguration();

// create your metric collector
DmnEngineMetricCollector metricCollector = ...;

// set the metric collector
configuration.setEngineMetricCollector(metricCollector);

Слушатели события оценки решений

Конфигурация движка DMN позволяет вам добавить кастомизированный слушатель события оценки решений. Такого рода слушатель получает уведомление после того, как все требуемые решения были оценены. Он получает событие оценки, которое содержит результат оценки. Вы можете решить, должен ли этот слушатель получать уведомление до или после слушателей по умолчанию.

// create default DMN engine configuration
DmnEngineConfiguration configuration = DmnEngineConfiguration
    .createDefaultDmnEngineConfiguration();

// instantiate the listener
DmnDecisionEvaluationListener myListener = ...;

// notify before default listeners
configuration.getCustomPreDecisionEvaluationListeners()
  .add(myListener);

// notify after default listeners
configuration.getCustomPostDecisionEvaluationListeners()
  .add(myListener);

Кастомизация и расширение движка DMN

Пожалуйста, примите во внимание, что эти API не являются частью публичного API и могут измениться в будущих релизах.

Конфигурация движка DMN по умолчанию имеет потенциал по дальнейшей кастомизации и расширению.

Кастомизация DMN преобразований

Можно кастомизировать преобразования в DMN, предоставив a DMN преобразователь или сконфигурировав преобразователь по умолчанию.

Регистрация слушателей DMN преобразований

Самая простая кастомизация — это предоставить слушатель преобразований. Слушатель получает уведомление после преобразования элемента DMN. Слушатель может модифицировать преобразованный объект.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// instantiate transform listener
DmnTransformListener myTransformListener = ... ;

// add the transform listener
configuration.getTransformer()
  .getTransformListeners()
  .add(myTransformListener);

Регистрация обработчика преобразований элемента в DMN

В то время как слушатель преобразований позволяет модифицировать преобразованный объект, он не позволяет инстанциировать кастомизированные подклассы. Это можно сделать, используя кастомизированный обработчик преобразований.

Обработчик преобразований регистрируется для заданного типа API DMN модели как DecisionTable.

Прежде всего реализуйте обработчик преобразований, который может преобразовать таблицу решений.

public  class MyDecisionTableHandler extends DmnElementTransformHandler<DecisionTable, MyDecisionTableImpl> {

  public MyDecisionTableImpl handleElement(DmnElementTransformContext context, DecisionTable element) {
    // implement
  }
}

Затем зарегистрируйте экземпляр обработчика в реестре обработчиков элементов преобразователя DMN по умолчанию.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// add the handler
configuration.getTransformer()
  .getElementTransformHandlerRegistry()
  .addHandler(DecisionTable.class, new MyDecisionTableHandler());

Регистрация преобразователей типов данных DMN

Движок DMN поддерживает набор встроенных типов данных. Существующие типы данных можно перекрыть новыми типами.

Предположим, вы хотите поддержать тип локального формата данных Чтобы этого добиться, необходимо реализовать кастомизированный преобразователь и заменить им существующий преобразователь для дат:

public class GermanDateDataTypeTransformer extends DateDataTypeTransformer {

  protected SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

  protected Date transformString(String value) {
    try {
      return format.parse(value);
    }
    catch (ParseException e) {
      throw new IllegalArgumentException(e);
    }
  }
}

Затем зарегистрируйте экземпляр обработчика в реестре обработчиков элементов преобразователя DMN по умолчанию:

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// add the data type transformer,
// overriding the existing type "date":
configuration
  .getTransformer()
  .getDataTypeTransformerRegistry()
  .addTransformer("date", new GermanDateDataTypeTransformer());

Также существует возможность добавить новый тип данных, реализовав новый преобразователь и зарегистрировав его для несуществующего названия типа:

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// add the data type transformer for custom type "currency"
configuration
  .getTransformer()
  .getDataTypeTransformerRegistry()
  .addTransformer("currency", new currencyTypeTransformer());

Регистриация обработчиков Hit Policy

Движок DMN поддерживает подмножество DMN 1.3 hit policies (термин hit policy означает политику выборки элемента в таблице принятия решений, правило отбора данных — прим. пер.). Можно реализовать новые hit policies или перекрыть существующую реализацию hit policy.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// get the DmnHitPolicyHandlerRegistry
DmnHitPolicyHandlerRegistry hitPolicyHandlerRegistry = configuration
  .getTransformer()
  .getHitPolicyHandlerRegistry();

// register handler you own priority hit policy handler
hitPolicyHandlerRegistry
  .addHandler(HitPolicy.PRIORITY, null, new MyPriorityHitPolicyHandler());

Смена языков выражений по умолчанию

Таблица решений в DMN содержит многочисленные выражения, которые оцениваются (вычисляются) при выполнении таблицы. Можно сконфигурировать язык выражений по умолчанию для каждого типа выражений. Существуют следующие типы выражений:

  • Input Expression: Используется для задания поля ввода в колонке в таблице решений. Языком по умолчанию для таких выражений в движке DMN является FEEL.

  • Input Entry: Используется для задания условия в правиле в таблице решений. Языком по умолчанию для таких выражений в движке DMN является FEEL.

  • Output Entry: Используется для задания вывода правила в таблице решений. Языком по умолчанию для таких выражений в движке DMN является FEEL.

Языком выражений по умолчанию для литерального выражения в DMN решении тоже может конфигурироваться, по умолчанию движок DMN использует FEEL.

Вы можете получить больше информации о выражениях по умолчанию в соответствующем разделе.

Язык выражений по умолчанию можно поменять в конфигурации движка DMN:

DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

configuration
  .setDefaultInputExpressionExpressionLanguage("javascript");

Пожалуйста, обратите внимание на то, что выбранный язык должен быть доступен в classpath. По умолчанию доступны JUEL м FEEL.

Если JDK включает реализацию на JavaScript, например, Rhino или Nashorn, тогда javascript тоже будет доступен.

Можно также использовать другие скриптовые языки, например, groovy, python или ruby. Просто убедитесь в том, что соответствующие библиотеки доступны в classpath в рантайме.

Кастомизация выражений и интерпретация скриптов

По умолчанию движок DMN интерпретирует поддерживаемые выражения и скриптовые языки, используя различные провайдеры.

Чтобы вычислить значение JUEL выражения, движок DMN использует ElProvider, сконфигурированный в конфигурации движка DMN. Чтобы использовать другую реализацию Единого Языка Выражений (Unified Expression Language), замените эту реализацию.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// set a custom el provider
configuration.setElProvider(new MyElProvider());

Чтобы сконфигурировать используемый движок FEEL, вы можете подставить кастомизированный FeelEngineFactory.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// set a custom feel engine factory
configuration.setFeelEngineFactory(new MyFeelEngineFactory());

Скриптовые языки интерпретируются с помощью DmnScriptEngineResolver. Чтобы кастомизировать интерпретацию скриптов в движке, предоставьте свою реализацию.

// with a default DMN engine configuration
DefaultDmnEngineConfiguration configuration = (DefaultDmnEngineConfiguration) DmnEngineConfiguration
  .createDefaultDmnEngineConfiguration();

// set custom script engine resolver
configuration.setScriptEngineResolver(new MyScriptEngineResolver());

Логирование

Движок DMN использует SLF4J как API логирования. Артефакт camunda-dmn-engine не содержит зависимостей ни от одного из существующих SLF4J бэкендов. Это означает, что вы можете выбирать, какой бэкенд вы хотите использовать. Одним из возможных примеров является LOGBack, либо, если вы хотите использовать Java util логирование, вы можете использовать артефакт slf4j-jdk14. Больше информации о конфигурировании и использовании SLF4J доступно в руководстве пользователя.

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

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

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