ProcessDefinition/ProcessInstance/Execution/Task关系和区别

ProcessDefinition :
     这个最好理解,就是流程的定义,也就相当于规范。 ProcessDefinition也有id,这个id是 {key}-{version},在部署过程中,会把一个id分配给流程定义。 这个id的格式为{key}-{version}, key和version之间使用连字符连接。
     如果没有提供key, 会在名字的基础自动生成。 生成的key会把所有不是字母和数字的字符替换成下划线。

ProcessInstance :
     这个也比较好理解,就是流程的一个实例。在系统中,也有一个ProcessInstance的Id。key可以用来创建流程实例的id, 格式为{process-key}.{execution-id}。如果没有提供用户定义的key,数据库就会把主键作为key。

用Java来讲: ProcessDefinition就是代码中的一个类,而ProcessInstance就是把这个类new了出来,创建了一个实例;

Execution :

目前这个还比较难以理解。在jBPM官方上是这么说的:
      http://jboss.org/jbpm 写道,Each execution of a process definition is called a process instance.

每一个流程定义的实施,被成为process instance。这个只讲了ProcessDefinition与ProcessInstance之间的关系。

在ExecutionService中,start的是ProcessInstance。

在ProcessInstance的JavaDoc中把ProcessInstance和Execution区别讲了出来:
ProcessInstance的Javadoc 写道
a process instance is one execution of a process definition. One process instance can have many concurrent executions. Executions are structured in a tree of which the ProcessInstance is the root.

一个Process Instance(流程实例)是一个ProcessDefinition(流程定义)的执行;

一个Process Instance(流程实例)可以有许多同时执行的步骤(concurrent executions)

执行步骤组成了以ProcessIntance(流程实例)为根节点(root)的结构化树

在文档中,关于ExecutionId和ProcessId,在介绍的时候有这么一句:
http://www.family168.com/tutorial/jbpm4.0/html/services.html 写道
有时execution id和流程实例id是不同的 ,当一个节点中使用了定时器,execution id中就会使用额外的后缀, 这就会导致当我们通过execution id查询时,这个节点不会出现在结果列表中。

实际操作下来也是如此:
刚开始的时候,ExectionId与ProcessId是相同的;
如果流程执行中,每时刻只有一个步骤(是否可以说任务)在处理,则ExectionId和ProcessId是相同的,
但是当同一时刻有多个任务要处理,譬如上述的定时器、或者进入fork/join流程,这个时候ExectionId和ProcessId就不同。
可以理解为Execution为执行路径,当同时有几个路径在执行,ExecutionId就和ProcessId不同了
而且:Execution是ProcessInstance的基类

// get execution service 
ExecutionService executionService = processEngine.getExecutionService(); 
// get current execution through processId 
Execution execution = executionService.findExecutionById(processId); 
// get a task query 
TaskQuery tq = taskService.createTaskQuery(); 
// get current task 
List<Task> taskList1 = tq.executionId(execution.getId()).list(); 
List<Task> taskList2 = tq.processInstanceId(processId).list();

上述的程序,如果在一般时候,taskList1,和taskList2是一样的。

但是当进入fork/join流程,这个时候executionId已经更改,

   taskList1取不到任何任务,taskList2能取回任务

Task :

    Task简单,就是当前要做的工作。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为语言模型,我无法画图。但是,我可以提供以下BPMNleave_process.bpmn流程定义文件的示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://activiti.org/bpmn"> <process id="leave_process" name="请假流程"> <startEvent id="start" name="开始"></startEvent> <userTask id="managerTask" name="经理审核" activiti:assignee="${manager}"></userTask> <userTask id="hrTask" name="人事审核" activiti:assignee="${hr}"></userTask> <endEvent id="end" name="结束"></endEvent> <sequenceFlow id="flow1" sourceRef="start" targetRef="managerTask"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="managerTask" targetRef="hrTask"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="hrTask" targetRef="end"></sequenceFlow> </process> </definitions> ``` 这个流程定义文件中包含一个名为leave_process的流程定义,其中包含三个用户任务:经理审核、人事审核和一个开始事件以及一个结束事件。其中,经理审核和人事审核任务都有一个指定的assignee(即任务的执行者)。在流程启动时,我们在流程变量中设置了三个人员的名字。经理审核和人事审核任务的assignee都是从流程变量中获取的。最后,我们通过TaskService完成了经理审核和人事审核的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值