专栏简介
️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。
️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda
️请给snail-camunda 点颗星吧
流程定义
流程定义就是对流程的结构进行建模,Camunda是使用BPMN2.0来对流程定义进行建模。相关内容在认识BPMN2.0中也有提及。
挂起流程定义
挂起流程定义会暂时禁用它,即在挂起时无法实例化它。当然可以激活流程定义来撤消此效果。
Key和版本
流程定义的Key是它的标识符,也就是xml中的这个id,如果使用同一个Key多次部署流程定义,则流程引擎会视为同一个流程定义的不同版本。
Camunda流程引擎支持以下功能:
- 每次部署相关Key的流程定义,则会在数据库中获得新版本。
- 正在运行的流程实例将继续在启动它们的版本中运行。
- 除非明确指定,否则新的流程实例将在新版本中运行。
- 在特定限制范围内,支持将流程实例迁移到新版本。
流程实例
流程实例与流程定义的关系就像Java中对象和类之间的关系。【实例扮演着对象,定义扮演着类】。
流程引擎负责创建流程实例并管理其状态。如果启动包含等待状态的流程实例(例如用户任务),那么流程引擎必须确保捕获流程实例的状态并将其存储在数据库中,直到等待状态离开(用户任务完成)。
启动流程实例
可以在启动流程实例时传入一些变量。流程变量可用于流程实例中的所有任务【流程变量是全局变量】,并在流程实例达到等待状态时自动保存到数据库中。
Map<String, Object> variables = new HashMap<String,Object>();
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());
文章评论