流程引擎概念

       本节介绍了在流程引擎API和内部流程引擎实现中都使用的一些核心流程引擎概念。了解这些基础知识将使使用流程引擎API更加容易。

流程定义

 

流程定义定义了流程的结构。您可以说流程定义就是流程。盘古BPM使用BPMN 2.0作为其主要建模语言来对流程定义进行建模。

盘古BPM附带了两个BPMN 2.0参考:

1、《BPMN 2.0建模参考》介绍了BPMN 2.0的基础知识,并帮助您开始建模过程。(请务必同时阅读本教程。)

2、《 BPMN 2.0实现参考》介绍了盘古BPM中各个BPMN 2.0构造的实现。 如果要实现和执行BPMN流程,应该查阅该参考资料。

在盘古BPM中,您可以将流程以BPMN 2.0 XML格式部署到流程引擎。XML文件被解析并转换为流程定义图结构。此图结构由流程引擎执行。

查询流程定义

您可以使用Java API查询所有已部署的流程定义,并ProcessDefinitionQuery可以通过来查询RepositoryService。例:

List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()

    .processDefinitionKey("invoice")

    .orderByProcessDefinitionVersion()

    .asc()

    .list();

上面的查询返回invoice按version属性排序的所有已部署流程定义的键。

您还可以使用REST API查询流程定义

key和版本

流程定义的关键字(invoice在上面的示例中)是流程的逻辑标识符。它在整个API中都使用,最主要的是用于启动流程实例(请参阅流程实例部分)。使用BPMN 2.0 XML文件中id相应<process ... >元素的属性定义流程定义的键:

<process id="invoice" name="invoice receipt" isExecutable="true">

  ...</process>

如果您使用相同的密钥部署多个流程,则流程引擎会将它们视为同一流程定义的各个版本。有关详细信息,请参阅过程版本控制

挂起流程定义

暂停流程定义会暂时禁用它,即,在暂停过程中无法实例化它。在RuntimeServiceJava的API可用于挂起一个过程定义。同样,您可以激活流程定义以撤消此影响。

流程实例

流程实例是流程定义的单独执行。流程实例与流程定义之间的关系与面向对象编程中对象与类之间的关系相同(在这个类比中,流程实例扮演对象的角色,流程定义扮演类的角色)。

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

启动流程实例

启动流程实例的最简单方法是使用startProcessInstanceByKey(...)RuntimeService提供的方法:

ProcessInstance instance = runtimeService.startProcessInstanceByKey("invoice");

您可以选择传入两个变量:

Map<String, Object> variables = new HashMap<String,Object>();

variables.put("creditor", "Nice Pizza Inc.");

ProcessInstance instance = runtimeService.startProcessInstanceByKey("invoice", variables);

流程变量可用于流程实例中的所有任务,并在流程实例达到等待状态时自动保存到数据库中。

也可以使用REST API启动流程实例

通过任务列表启动流程实例

如果使用“ 任务列表”启动流程实例,则startableInTasklist存在该选项以指定哪些流程对于用户启动可见。

例如,这对于子流程可能是明智的:如果仅应该启动超级流程而不是子流程,则可以如下调整流程xml文件(* .bpmn):

<process id="subProcess"

         name="Process called from Super Process"

         isExecutable="true"

         pangu:isStartableInTasklist="false">

...</process>

在任何一组活动中启动流程实例

startProcessInstanceByKey和startProcessInstanceById方法以默认的初始活动启动流程实例,该活动通常是流程定义的单个空白启动事件。 通过使用流程实例的构建器,也可以在流程实例中的任何地方启动。 可以通过RuntimeService方法createProcessInstanceByKey和createProcessInstanceById访问流程的构建器。

下面的代码在活动SendInvoiceReceiptTask和嵌入式子流程DeliverPizzaSubProcess之前启动一个流程实例:

ProcessInstance instance = runtimeService.createProcessInstanceByKey("invoice")

  .startBeforeActivity("SendInvoiceReceiptTask")

  .setVariable("creditor", "Nice Pizza Inc.")

  .startBeforeActivity("DeliverPizzaSubProcess")

  .setVariableLocal("destination", "12 High Street")

  .execute();

返回变量

要访问执行期间流程实例使用的最新变量,executeWithVariablesInReturn可以使用代替execute方法。请参见以下示例:

ProcessInstanceWithVariables instance = runtimeService.createProcessInstanceByKey("invoice")

  .startBeforeActivity("SendInvoiceReceiptTask")

  .setVariable("creditor", "Nice Pizza Inc.")

  .startBeforeActivity("DeliverPizzaSubProcess")

  .setVariableLocal("destination", "12 High Street")

  .executeWithVariablesInReturn();

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

查询流程实例

您可以使用ProcessInstanceQuery提供的查询所有当前正在运行的流程实例RuntimeService:

runtimeService.createProcessInstanceQuery()

    .processDefinitionKey("invoice")

    .variableValueEquals("creditor", "Nice Pizza Inc.")

    .list();

上面的查询将为is 为的invoice流程选择所有流程实例。creditorNice Pizza Inc.

您还可以使用REST API查询流程实例

 技术支持:盘古BPM工作流平台

相关教程