jbpm 总结

来源:互联网 发布:虎嗅 源码 编辑:程序博客网 时间:2024/06/09 13:46

最近开始接触JBPM4,网上关于JBPM4的资料少之又少。大多是关于JBPM3的。而4跟3的API差异也较大。在学习过程中做了一点关于JBPM4的笔记。强烈期望JBPM4达人能贡献一些JBPM4方面的学习资料或视频教程或出版发行JBPM4的书籍之类的。
本文电子版下载

流程定义引擎:

ProcessEngine processEngine;

获取:

processEngine=Configuration.getProcessEngine();

重要的几个接口:

RepositoryService repositoryService;

ExecutionService executionService;

TaskService taskService;

HistoryService historyService;

ManagementService managementService;

获取:

repositoryService=processEngine.getRepositoryService();

executionService=processEngine.getExecutionService();

taskService=processEngine.getTaskService();

historyService=processEngine.getHistoryService();

managementService=processEngine.getManagementService();

说明:

RepositoryService主要用来管理和发布流程定义,发布流程定义、删除流程定义、查看流程定义。

流程定义发布:

repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

注:此方法表示从classpath路径加载一个流程定义文件,并发布,上例中demo.jpdl.xml文件位于src(classpath)路径下,若流程定义文件放置与包中,则需要使用包名+jpdl文件名。如com/jbpm/demo.jpdl.xml

查看流程定义:

repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();

Listlist=repositoryService.createProcessDefinitionQuery().list();

for (ProcessDefinition processDefinition : list){

  System.out.println("流程定义Id:"+processDefinition.getId());

  System.out.println("流程部署Id:"+processDefinition.getDeploymentId());

}

删除流程定义:

StringdeploymentId=repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();

repositoryService.deleteDeploymentCascade(deploymentId);

deploymentId为流程定义部署Id

ExecutionService主要用来操作流程实例,启动流程实例、查看流程实例、删除流程实例、结束流程实例。

其前提条件是发布了流程定义

启动流程实例:

repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

     ProcessInstanceprocessInstance=executionService.startProcessInstanceByKey("demo");

使用executionService.startProcessInstanceByKey("demo");方法来启动一个流程实例。其中startProcessInstanceByKey就表示以key的方式来启动流程实例,key为流程定义文件中process节点的key属性,若未明确给出key属性,则默认key属性的值与name属性的值相同。

同样也可以使用executionService.startProcessInstanceById(processDefinitionId)的方式来启动流程实例。此方法是用流程定义文件中process节点的id属性来启动流程实例。

其Id属性由两部分组成流程定义的key和流程定义的版本来组成。形如key-version

例如:

ProcessInstanceprocessInstance=executionService.startProcessInstanceById("demo-1");

其中demo-1就为流程定义中的流程Id,其key为demo,版本号为1

同样使用此方法可用来启动指定版本号的流程实例。

查看流程实例:

Listlist=executionService.createProcessInstanceQuery().list();

for (ProcessInstance processInstance : list) {

  System.out.println("流程实例Id:"+processInstance.getId());

  System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

}

级联删除流程实例:

executionService.deleteProcessInstanceCascade(processInstance.getId());

结束流程实例:

executionService.endProcessInstance(processInstance.getId(),"结束流程实例");

注意:在使用executionService.endProcessInstance()对流程实例进行结束操作后,需要重新查询processInstance才能得到更新后的流程实例,如果流程已结束,则查询结果为null

如:

executionService.endProcessInstance(processInstance.getId(),"结束流程实例");

System.out.println(processInstance.isEnded());

此行代码是无意义的,因为此时并未获取到更新后的流程实例,需要重新查询流程实例,所以此处返回为false

System.out.println("-----------查询流程实例--------------->");

Listlist=executionService.createProcessInstanceQuery().list();

for (ProcessInstance processInstance : list) {

  System.out.println("流程实例Id:"+processInstance.getId());

  System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

}

结果:

false

-----------查询流程实例--------------->

使流程向下执行:

在使用executionService启动流程实例后,流程会顺着向下执行(即启动流程实例后,流程会从start节点向下移动),在state或task节点,流程会暂停下来,满足条件后流程会向下继续执行,直到流程end节点,结束流程。

在程序中是流程遵循某一条件,沿着某个方向流动的方法为executionService.signalExecutionById();

该方法有多个重载:

ProcessInstance signalExecutionById(StringexecutionId);

//若在流程定义某一个节点没有分支时(只有一个transition时),调用此方法,可将流程继续向下执行executionId为流程实例Id

ProcessInstance signalExecutionById(StringexecutionId, String signalName);

//若在流程定义某一个节点有多个分支时(有多个transition时),调用此方法,可将流程沿着transition所指的方向向下执行

executionId为流程实例Id,signalName为流程定义中transition节点的name属性的值

ProcessInstance signalExecutionById(StringexecutionId, String signalName, Map parameters);

用于将流程沿着signalName方向(transition的name属性所指的方向)向下继续执行,在执行的过程中顺便传递参数parameters

ProcessInstance signalExecutionById(StringexecutionId, Map parameters);

用于将流程向下继续执行,在执行的过程中顺便传递参数parameters

注:当一个节点有多个分支时,若要通过signalExecutionById()方法将流程向下执行必须明确指出signalName即(transition的name属性所指的方向),否则流程不会向下执行,仍会停留在当前节点。因为jbpm不确定流程该流向那个方向。

示例代码:

1. 没有分支的state流向

流程定义文件:

0 0
原创粉丝点击