• jBPM4.4: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官方上是这么说的:

    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的基类 

    具体的表现就是

    Java代码  收藏代码
    1. // get execution service  
    2. ExecutionService executionService = processEngine.getExecutionService();  
    3.   
    4. // get current execution through processId  
    5. Execution execution = executionService.findExecutionById(processId);  
    6. // get a task query   
    7. TaskQuery tq = taskService.createTaskQuery();  
    8. // get current task  
    9. List<Task> taskList1 = tq.executionId(execution.getId()).list();  
    10. List<Task> taskList2 = tq.processInstanceId(processId).list();  

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

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

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

    Task :

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

    JavaDoc中 写道
    a runtime task. In contrast to HistoryTask, a Task only represents the runtime state of a task and hence it will be deleted after it is completed.
  • 相关阅读:
    MSSQL经典语句
    注销时关闭当前窗体,返回登入界面
    自定义控件小结进阶篇
    精妙SQL语句大全
    触发器MSSQL常用操作
    经典SQL语句大全
    文件下载
    android Notification 的使用
    startActivityForResult()的用法
    Android手机中获取手机号码和运营商信息
  • 原文地址:https://www.cnblogs.com/eggbucket/p/2934813.html
Copyright © 2020-2023  润新知