当我们把流程给部署好了,而且流程处于激活状态,我们需要使用流程的时候就涉及到流程的启动。
我们以下面的代码为例子,详细给大家讲解一下如何启动一个流程。
public int insertWorkflowLeave(WorkflowLeave workflowLeave) {
String id = UUID.randomUUID().toString();
workflowLeave.setId(id);
String join = StringUtils.join(sysUserService.selectUserNameByPostCodeAndDeptId("se", SecurityUtils.getLoginUser().getUser().getDeptId()), ",");
ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey("leave")
.withName(workflowLeave.getTitle())
.withBusinessKey(id)
.withVariable("deptLeader",join)
.build());
workflowLeave.setInstanceId(processInstance.getId());
workflowLeave.setState("0");
workflowLeave.setCreateName(SecurityUtils.getNickName());
workflowLeave.setCreateBy(SecurityUtils.getUsername());
workflowLeave.setCreateTime(DateUtils.getNowDate());
return workflowLeaveMapper.insertWorkflowLeave(workflowLeave);
}
启动流程之前我们肯定有自己的业务表单数据,我们可能是一个请假表单,或者一个出查表单,或者一个申请补贴表单等等。这个业务表单是完全独立于工作流的。
我们需要把业务表单和工作流中的表单关联起来,所以需要一个id,我们把它叫做业务id,就是BusinessKey。
把这个id放在自己的业务表单,同时放到工作流中,这样就将两者关联起来。
同时我们启动流程后需要指定下一个节点的任务领取人,就是在代码中的.withVariable("deptLeader",join)。需要注意的是deptLeader是流程变量的名称,对应的是bpmn图中的这个节点的候选用户。如下图所示:
启动流程的时候需要一个流程key,对应的是bpmn图中的编号。
下面就详细解释一下流程启动代码的含义。
ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey("leave")
.withName(workflowLeave.getTitle())
.withBusinessKey(id)
.withVariable("deptLeader",join)
.build());
这段代码是使用Activiti流程引擎启动一个名为"leave"的流程实例。具体解析如下:
-
processRuntime.start
是启动一个新的流程实例的方法,其中processRuntime
是 Activiti 的运行时服务。 -
ProcessPayloadBuilder
是用于构建流程实例参数的工具类。 -
start()
方法是开始构建流程实例,使用ProcessPayloadBuilder.start()方法构建流程实例的初始payload(包含流程定义和初始状态等信息)。 -
withProcessDefinitionKey("leave")
设置流程定义的key为 "leave",这意味着我们要启动的流程定义的key是 "leave"。 -
withName(workflowLeave.getTitle())
设置流程实例的名称为workflowLeave
对象的title
属性。 -
withBusinessKey(id)
设置流程实例的业务键为变量id
。 -
withVariable("deptLeader",join)
设置流程变量 "deptLeader" 的值为join
。 -
build()
是完成流程参数构建的方法,返回一个ProcessInstance
对象。
所以,整体来说,这段代码的作用是启动一个名为 "leave" 的流程实例,并设置了该流程实例的一些参数,如流程定义的key、名称、业务键和一个名为 "deptLeader" 的流程变量。
payload是什么意思?
在BPMN 2.0中,payload是指一个包含了流程定义和初始状态等信息的对象。在一个BPMN 2.0流程图中,每个节点(包括起点和终点)都有一个或多个payload,用于描述该节点的输入和输出信息。
在启动一个BPMN 2.0流程实例时,需要构建一个payload对象,并将其传入ProcessRuntime.start()方法中。在流程实例的生命周期中,payload对象中的信息会被用于描述流程实例的状态和参数。例如,在一个节点上执行一个用户任务时,需要根据该节点的payload中的参数来确定用户需要输入或输出的信息。
在代码中,可以使用ProcessPayloadBuilder类来构建payload对象。ProcessPayloadBuilder提供了一系列方法,用于设置流程实例的初始状态、变量、流程定义等信息。通过使用这些方法,可以构建出不同的payload对象,从而启动不同的流程实例。