activiti6.0流程引擎部署方式之BpmnModel以及使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activiti6.0流程引擎部署方式之BpmnModel以及使用相关的知识,希望对你有一定的参考价值。
参考技术A 在流程资源文件中,每一个节点元素在activiti中都有对应的元素属性承载类,比如,UserTask任务节点,它的元素属性承载类为UserTask,相同,startEvent开始节点的元素承载类为StartEvent,在bpmn流程文件进行解析时,也是将xml文档中每个元素解析为对应的承载类,从而进行组装成一个BmpnModel模型,我们可以直接由activiti将bpmn xml文件解析为一个实例模型(下图所示),也可以完成通过自定义手动创建模型。关于模型校验器更多细节可查看 activiti源码剖析之BpmnModel模型校验器
Activiti 流程部署方式 activi 动态部署(高级源代码篇)
Activiti的流程 部署方式有非常多种方式,我们能够依据activit工作流引擎提供的ap方式进行部署。
当然了实际需求决定你要使用哪一种api操作,后面的总结具体介绍了使用场景。
以下看一下部署方式。
流程部署的方式在类org.activiti.engine.repository.DeploymentBuilder中定义的部署方接口式例如以下 :
DeploymentBuilder addInputStream(String resourceName, InputStream inputStream); DeploymentBuilder addClasspathResource(String resource); DeploymentBuilder addString(String resourceName, String text); DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream); DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);
能够看出activit工作流引擎一共提供五种方式进行流程对的部署。
addInputStream 依据流进行部署。
addClasspathResource 依据resource部署。
addString依据字符串部署。
addZipInputStream依据zip流进行部署。
addBpmnModel 依据BpmnModel进行部署。
这样的方式使用的场景就是我们自己设计一个流程设计器画布。自己去解析成bpmn规范文件。适合动态的拓展。自己定义。
以下一一解说怎样使用api去进行部署。
1.1.1. addInputStream方式
流程定义例如以下所看到的:
<?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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="daling"> <process id="daling" name="name_daling" isExecutable="true" activiti:candidateStarterUsers="a,b,c,d"> <startEvent id="startevent1" name="Start"></startEvent> <userTask id="usertask1" name="usertask1审批" activiti:candidateGroups="1,2"></userTask> <userTask id="usertask2" name="usertask2审批" activiti:candidateUsers="b,c"></userTask> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_daling"> <bpmndi:BPMNPlane bpmnElement="daling" id="BPMNPlane_daling"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="10.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> <omgdc:Bounds height="55.0" width="105.0" x="280.0" y="192.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="340.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="247.0" y="45.0"></omgdi:waypoint> <omgdi:waypoint x="352.0" y="110.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="352.0" y="165.0"></omgdi:waypoint> <omgdi:waypoint x="332.0" y="192.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="332.0" y="247.0"></omgdi:waypoint> <omgdi:waypoint x="247.0" y="340.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
程序代码例如以下所看到的:
InputStream inputStream=ProcessEnginesDemo.class.getClassLoader().getResourceAsStream("demo1.bpmn"); Deployment deploy = repositoryService2.createDeployment().addInputStream("addInputStream", inputStream).deploy(); System.out.println(deploy);
程序的执行结果例如以下所看到的:
1.1.2. addClasspathResource方式
流程的定义还是第一种方式的流程图,程序例如以下所看到的:
Deployment deploy2 =repositoryService2.createDeployment().addClasspathResource("demo1.bpmn").deploy();
addClasspathResource中的參数是依据classpath方式载入,假设demo1.bpmn路径在com.daling.ch1.ProcessEnginesDemo包以下则參数參入com/daling/ch1/ProcessEnginesDemo/demo1.bpmn
程序的执行例如以下图所看到的:
1.1.3. addString方式
流程的定义还是第一种方式的流程图,程序例如以下所看到的:
String str=read("D:\\WorkSpace\\activitidemo\\src\\main\\resources/demo1.bpmn"); Deployment deploy2 = repositoryService2.createDeployment().addString("string", str).deploy(); public static String read(String filePath) { // 读取txt内容为字符串 StringBuffer txtContent = new StringBuffer(); // 每次读取的byte数 byte[] b = new byte[8 * 1024]; InputStream in = null; try { // 文件输入流 in = new FileInputStream(filePath); while (in.read(b) != -1) { // 字符串拼接 txtContent.append(new String(b)); } // 关闭流 in.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return txtContent.toString(); }
程序的执行效果例如以下图所看到的:
1.1.4. addZipInputStream方式
流程的定义还是第一种方式的流程图。仅仅只是讲demo1.bpmn打包成zip文件,结构例如以下:
程序操作例如以下所看到的:
InputStream inputStream=ProcessEnginesDemo.class.getClassLoader().getResourceAsStream("demo1.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
Deployment deploy2 =repositoryService2.createDeployment().addZipInputStream(zipInputStream).deploy();
程序的输出结果例如以下图所看到的:
1.1.5. addBpmnModel方式
这一种方式比較复杂须要自己去手动拼接对象,这里我们就写一个简单的吧。实际开发中假设不够用能够自己扩展依据这个demo详细的实现方式例如以下:
ProcessEnginesDemo demo = new ProcessEnginesDemo(); RepositoryService repositoryService2 = demo.getRepositoryService(); BpmnModel bpmnModel=new BpmnModel(); StartEvent startEvent=new StartEvent(); startEvent.setId("start1shareniu"); startEvent.setName("start1shareniu"); UserTask userTask=new UserTask(); userTask.setId("userTask1shareniu"); userTask.setName("userTask1shareniu"); EndEvent endEvent=new EndEvent(); endEvent.setId("endEventshareniu"); endEvent.setName("endEventshareniu"); List<SequenceFlow> sequenceFlows=new ArrayList<SequenceFlow>(); List<SequenceFlow> toEnd=new ArrayList<SequenceFlow>(); SequenceFlow s1=new SequenceFlow(); s1.setId("starttouserTask"); s1.setName("starttouserTask"); s1.setSourceRef("start1shareniu"); s1.setTargetRef("userTask1shareniu"); sequenceFlows.add(s1); SequenceFlow s2=new SequenceFlow(); s2.setId("userTasktoend"); s2.setName("userTasktoend"); s2.setSourceRef("userTask1shareniu"); s2.setTargetRef("endEventshareniu"); toEnd.add(s2); startEvent.setOutgoingFlows(sequenceFlows); userTask.setOutgoingFlows(toEnd); userTask.setIncomingFlows(sequenceFlows); endEvent.setIncomingFlows(toEnd); Process process=new Process(); process.setId("process1"); process.addFlowElement(startEvent); process.addFlowElement(s1); process.addFlowElement(userTask); process.addFlowElement(s2); process.addFlowElement(endEvent); bpmnModel.addProcess(process); repositoryService2.createDeployment().addBpmnModel("bpmnModel", bpmnModel).deploy();
程序的输出截下图所看到的:
总结:
五种方式的总结:
1.假设须要自己开发一套流程设计的话就使用addBpmnModel这样的方法吧。这样的方式更加灵活。缺点就是须要了解每个对象的含义,须要对bpmnMode对象中的各个子对象都有所了解。
2.假设项目中的流程图是固定的可是一些候选组或者人或者名称不是固定的。须要从数据库中查询出来赋值在部署使用addString这样的方法,配合velocity等叶面静态化工具一起使用。
3.假设须要用户自己上传文件部署的话,能够使用addInputStream和addZipInputStream这两种方式。
以上是关于activiti6.0流程引擎部署方式之BpmnModel以及使用的主要内容,如果未能解决你的问题,请参考以下文章
Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程
Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程
java Activiti6.0 后台 框架 spring5 SSM 工作流引擎 审批流程