Версионирование процессов
|
Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine |
Версионирование определений процессов (Versioning of Process Definitions)
Бизнес‑процессы по своей природе являются длительно выполняющимися. Экземпляры процессов могут длиться неделями или месяцами. При этом состояние экземпляра процесса хранится в базе данных. Но рано или поздно вам может понадобиться изменить определение процесса, даже если всё ещё есть выполняющиеся (running) экземпляры.
Process engine это поддерживает:
-
Если вы повторно разворачиваете (redeploy) изменённое определение процесса, в базе данных создаётся новая версия.
-
Запущенные экземпляры процессов продолжат выполняться в той версии, в которой они были запущены.
-
Новые экземпляры процессов будут выполняться в новой версии — если не указано явно иначе.
-
Поддержка миграции экземпляров процессов на новую версию доступна в определённых пределах.
Разные версии можно увидеть в таблице определений процессов, и экземпляры процессов связаны с ними:

| Если вы используете 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