Camunda流程引擎概念

Camunda流程引擎概念_第1张图片

专栏简介

✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。

✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda

✔️请给snail-camunda 点颗星吧

流程定义

流程定义就是对流程的结构进行建模,Camunda是使用BPMN2.0来对流程定义进行建模。相关内容在认识BPMN2.0中也有提及。

挂起流程定义

挂起流程定义会暂时禁用它,即在挂起时无法实例化它。当然可以激活流程定义来撤消此效果。

Key和版本

流程定义的Key是它的标识符,也就是xml中的这个id,如果使用同一个Key多次部署流程定义,则流程引擎会视为同一个流程定义的不同版本。

Camunda流程引擎概念_第2张图片

Camunda流程引擎支持以下功能:

  • 每次部署相关Key的流程定义,则会在数据库中获得新版本。
  • 正在运行的流程实例将继续在启动它们的版本中运行。
  • 除非明确指定,否则新的流程实例将在新版本中运行。
  • 在特定限制范围内,支持将流程实例迁移到新版本。

流程实例

流程实例与流程定义的关系就像Java中对象和类之间的关系。【实例扮演着对象,定义扮演着类】。

流程引擎负责创建流程实例并管理其状态。如果启动包含等待状态的流程实例(例如用户任务),那么流程引擎必须确保捕获流程实例的状态并将其存储在数据库中,直到等待状态离开(用户任务完成)。

启动流程实例

可以在启动流程实例时传入一些变量。流程变量可用于流程实例中的所有任务【流程变量是全局变量】,并在流程实例达到等待状态时自动保存到数据库中。

Map variables = new HashMap();
variables.put("creditor", "武松");
ProcessInstance instance = runtimeService.startProcessInstanceByKey("invoice", variables);

返回变量

如果流程实例结束或达到等待状态,则返回。返回的对象包含流程实例和最新变量的信息。

ProcessInstanceWithVariables instance = runtimeService.createProcessInstanceByKey("invoice")
.startBeforeActivity("UserTaskOne")
.setVariable("creditor", "武磊")
.executeWithVariablesInReturn();

挂起流程实例

挂起流程实例可以确保它不会进一步执行。例如,如果流程变量处于不需要的状态,则可以挂起实例并安全地更改。具体来说,挂起意味着禁止所有更改实例令牌状态的操作(即当前执行的活动)。属于它的所有任务都将被挂起。因此,将无法再调用对任务生命周期有影响的操作(即用户分配、任务委派、任务完成等)。但是可以进行一些不影响令牌状态的操作,比如设置或删除变量以及添加注释。

执行

执行是分层的,流程实例中的所有执行组成树结构,流程实例是树中的根节点。注意:流程实例本身是一个执行。执行是可变范围的,这意味着动态数据可以与它们关联。可以查询返回给定流程实例的所有执行。

runtimeService.createExecutionQuery()
    .processInstanceId(processInstanceId)
    .list();

活动实例

活动实例概念与执行概念类似,但采用不同的视角。通常情况下【活动实例】与【执行】之间是1对多的关系,

多实例活动由一个multi-instance body和内部活动组成。多实例体是围绕内部活动的作用域,并收集内部活动的活动实例。

ProcessInstance
  receive payment - Multi-Instance Body
    receive payment
    receive payment
  ship order - Multi-Instance Body
    ship order

可以通过以下接口来检索活动实例

ActivityInstance rootActivityInstance = runtimeService.getActivityInstance(processInstance.getProcessInstanceId());

Camunda流程引擎概念_第3张图片

你可能感兴趣的:(Camunda修炼手册,camunda,工作流)