flowable中已经去除了流程虚拟机中的各种对象(比如ActivityImpl或者TransitionImpl)和原子操作类,因此如果期望获取到定义的流程文档中的节点信息,那么该操作与Activiti的操作是完全不一样的。
但原理是类似的,使用flowable获取流程中的节点信息是非常简单的,但是需要大量的判断节点类型的操作。
本教程主要分以下几点内容:
一、 定义流程文档。
二、 部署流程文档
三、 节点信息的获取
1.1 定义流程文档
首先,我们定义一个流程文档,该流程文档图如下所示:
上面定义的流程非常的简单,一个开始节点、一个结束节点和2个任务节点。其中第一个任务对应的任务id为usertask1,第二个任务对应的任务id为usertask2。
1.2 部署流程
flowable部署流程文档的操作非常简单,这一点与Activiti类似,如下所示:
public void addInputStreamTest() {
// 定义的文件信息的流读取
InputStream inputStream = App.class.getClassLoader()
.getResourceAsStream("com/shareniu/flowablestudy/ch1/one.bpmn");
// 流程定义的分类
String category = "shareniu_addInputStream";
// 构造DeploymentBuilder对象
DeploymentBuilder deploymentBuilder = repositoryService
.createDeployment().category(category)
.addInputStream(resourceName, inputStream);
// 部署
Deployment deploy = deploymentBuilder.deploy();
}
1.3 获取节点信息
比如,我们现在需要获取到任务节点定义的所有信息,则可以执行如下代码:
@Test
public void getBpmnModel() {
BpmnModel bpmnModel = repositoryService.getBpmnModel("myProcess:1:4");
Process process = bpmnModel.getProcesses().get(0);
CollectionflowElements = process.getFlowElements();
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof UserTask) {
UserTask u = (UserTask) flowElement;
ListoutgoingFlows = u.getOutgoingFlows();
System.err.println("outgoingFlows:" + outgoingFlows);
}
System.err.println(flowElement.getId() + "--->>>>"
+ flowElement.getName());
}
}
上述代码中,myProcess:1:4为流程文档部署之后,产生的流程定义id值,其实现思路非常的简单,分为如下几个步骤:
(1)根据流程定义Id值获取BpmnModel。
(2)根据BpmnModel获取Process。
(3)根据Process获取所有的flowElements集合。
(4)遍历flowElements集合并根据节点的类型做一系列的判断。
上述代码中,不仅实现了获取流程定义中节点的信息,还附属完成了连线信息的获取。执行上述代码程序的输出如下:
startevent1--->>>>Start
org.flowable.bpmn.model.UserTask@5c0dc84
outgoingFlows:[usertask1 --> usertask2]
usertask1--->>>>usertask1
flow1--->>>>null
org.flowable.bpmn.model.UserTask@38cd610f
outgoingFlows:[usertask2 --> endevent1]
usertask2--->>>>usertask2
flow2--->>>>null
endevent1--->>>>End
flow3--->>>>null
转载请注明:分享牛 » flowable获取节点信息