Версионирование процессов

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

Версионирование определений процессов (Versioning of Process Definitions)

Бизнес‑процессы по своей природе являются длительно выполняющимися. Экземпляры процессов могут длиться неделями или месяцами. При этом состояние экземпляра процесса хранится в базе данных. Но рано или поздно вам может понадобиться изменить определение процесса, даже если всё ещё есть выполняющиеся (running) экземпляры.

Process engine это поддерживает:

  • Если вы повторно разворачиваете (redeploy) изменённое определение процесса, в базе данных создаётся новая версия.

  • Запущенные экземпляры процессов продолжат выполняться в той версии, в которой они были запущены.

  • Новые экземпляры процессов будут выполняться в новой версии — если не указано явно иначе.

  • Поддержка миграции экземпляров процессов на новую версию доступна в определённых пределах.

Разные версии можно увидеть в таблице определений процессов, и экземпляры процессов связаны с ними:

Versioning

Если вы используете multi-tenancy с tenant identifiers, то у каждого tenant есть собственные определения процессов, версии которых независимы от других tenants. Подробности см. в разделе multi-tenancy.

Какая версия будет использована (Which Version Will be Used)

Когда вы запускаете экземпляр процесса:

  • По key: запускается экземпляр последней развёрнутой версии (latest deployed version) определения процесса с этим key.

  • По id: запускается экземпляр развёрнутого определения процесса с указанным database id. Используя это, вы можете запустить конкретную версию.

Поведение по умолчанию и рекомендуемый способ использования — применять startProcessInstanceByKey и всегда использовать последнюю версию:

processEngine.getRuntimeService().startProcessInstanceByKey("invoice");
// will use the latest version (2 in our example)

Если вы хотите целенаправленно запустить экземпляр старого определения процесса, используйте Process Definition Query, чтобы найти правильный id ProcessDefinition, и вызовите startProcessInstanceById:

ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
    .processDefinitionKey("invoice")
    .processDefinitionVersion(1).singleResult();
processEngine.getRuntimeService().startProcessInstanceById(pd.getId());

При использовании BPMN CallActivities вы можете настроить, какая версия будет использована:

<callActivity id="callSubProcess" calledElement="checkCreditProcess"
  camunda:calledElementBinding="latest|deployment|version"
  camunda:calledElementVersion="17">
</callActivity>

или

<callActivity id="callSubProcess" calledElement="checkCreditProcess"
  camunda:calledElementBinding="versionTag"
  camunda:calledElementVersionTag="ver-tag-1.0.1">
</callActivity>

Варианты:

  • latest: использовать последнюю версию определения процесса (как при startProcessInstanceByKey).

  • deployment: использовать определение процесса в версии, соответствующей версии вызывающего процесса. Это работает, если они развёрнуты в рамках одного deployment — тогда они всегда версионируются совместно (см. Process Application Deployment для подробностей).

  • version: указать версию, жёстко заданную в XML.

  • versionTag: указать versionTag, жёстко заданный в XML.

Key vs. ID определения процесса (Key vs. ID of a Process Definition)

Вы могли заметить, что в таблице определений процессов есть два разных столбца с разным смыслом:

  • Key: key — это уникальный идентификатор определения процесса в XML, поэтому его значение читается из атрибута id в XML:

        <bpmn2:process id="invoice" ...
  • Id: id — это первичный ключ в базе данных и искусственный ключ, обычно составленный из key, версии и сгенерированного id (обратите внимание: ID может быть сокращён, чтобы поместиться в колонку базы данных, поэтому нет гарантии, что id формируется именно так).

Тег версии (Version Tag)

Определение процесса можно пометить тегом версии (version tag) с помощью атрибута. Это можно сделать, добавив extension‑атрибут camunda:versionTag к процессу:

<bpmn2:process camunda:versionTag="1.5-patch2" ..

Теперь ProcessDefinition будет предоставлять поле versionTag, которое можно получить:

ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
    .processDefinitionKey("invoice")
    .processDefinitionVersion(1).singleResult();

pd.getVersionTag();

или, чтобы получить список всех развёрнутых определений процессов, которые содержат указанную версию:

List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()
    .versionTag("1.5-patch2")
    .list();

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

List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()
    .versionTagLike("1.5-%")
    .list();

Следующий пример показывает, как запустить экземпляр процесса последнего определения процесса для заданного version tag:

ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
    .processDefinitionKey("invoice")
    .versionTag("1.5-patch2")
    .orderByVersion().
    .desc()
    .listPage(0,1);

processEngine.getRuntimeService().startProcessInstanceById(pd.getId());
Тег версии предназначен только для маркировки и не влияет на поведение startProcessInstanceByKey и startProcessInstanceById.
Свойства определения процесса version и versionTag — это разные свойства. При запросе через ProcessDefinitionQuery#latestVersion() для заданного key выбирается определение процесса с максимальным числом version. Добавление фильтра по version tag к этому запросу может привести к пустому результату, если последнее определение процесса не содержит запрошенный version tag.

Миграция экземпляров процесса (Process Instance Migration)

По умолчанию, когда развёртывается новая версия процесса, экземпляры процесса, выполняющиеся на предыдущих версиях, не затрагиваются.

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

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

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