一、 创建流程
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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="http://www.activiti.org/test"> 3 <process id="确定旅游地点" name="确定旅游地点" isExecutable="true"> 4 <startEvent id="startevent1" name="Start"></startEvent> 5 <receiveTask id="申请旅游经费" name="申请旅游经费"></receiveTask> 6 <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="申请旅游经费"></sequenceFlow> 7 <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway" default="缺省值"></exclusiveGateway> 8 <sequenceFlow id="flow2" sourceRef="申请旅游经费" targetRef="exclusivegateway1"></sequenceFlow> 9 <receiveTask id="国外游" name="国外游"></receiveTask> 10 <receiveTask id="国内游" name="国内游"></receiveTask> 11 <receiveTask id="省内游" name="省内游"></receiveTask> 12 <sequenceFlow id="经费大于等于10000" name="经费大于等于10000" sourceRef="exclusivegateway1" targetRef="国外游"> 13 <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money >= 10000}]]></conditionExpression> 14 </sequenceFlow> 15 <sequenceFlow id="经费大于1000小于10000" name="经费大于1000小于10000" sourceRef="exclusivegateway1" targetRef="国内游" skipExpression="经费大于1000小于10000"> 16 <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money > 1000 && money < 10000}]]></conditionExpression> 17 </sequenceFlow> 18 <sequenceFlow id="缺省值" name="缺省值" sourceRef="exclusivegateway1" targetRef="省内游"></sequenceFlow> 19 <endEvent id="endevent1" name="End"></endEvent> 20 <sequenceFlow id="flow6" sourceRef="国外游" targetRef="endevent1"></sequenceFlow> 21 <sequenceFlow id="flow7" sourceRef="国内游" targetRef="endevent1"></sequenceFlow> 22 <sequenceFlow id="flow8" sourceRef="省内游" targetRef="endevent1"></sequenceFlow> 23 </process> 24 <bpmndi:BPMNDiagram id="BPMNDiagram_确定旅游地点"> 25 <bpmndi:BPMNPlane bpmnElement="确定旅游地点" id="BPMNPlane_确定旅游地点"> 26 <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> 27 <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="50.0"></omgdc:Bounds> 28 </bpmndi:BPMNShape> 29 <bpmndi:BPMNShape bpmnElement="申请旅游经费" id="BPMNShape_申请旅游经费"> 30 <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="150.0"></omgdc:Bounds> 31 </bpmndi:BPMNShape> 32 <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"> 33 <omgdc:Bounds height="40.0" width="40.0" x="347.0" y="260.0"></omgdc:Bounds> 34 </bpmndi:BPMNShape> 35 <bpmndi:BPMNShape bpmnElement="国外游" id="BPMNShape_国外游"> 36 <omgdc:Bounds height="55.0" width="105.0" x="120.0" y="360.0"></omgdc:Bounds> 37 </bpmndi:BPMNShape> 38 <bpmndi:BPMNShape bpmnElement="国内游" id="BPMNShape_国内游"> 39 <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="360.0"></omgdc:Bounds> 40 </bpmndi:BPMNShape> 41 <bpmndi:BPMNShape bpmnElement="省内游" id="BPMNShape_省内游"> 42 <omgdc:Bounds height="55.0" width="105.0" x="530.0" y="360.0"></omgdc:Bounds> 43 </bpmndi:BPMNShape> 44 <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> 45 <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="490.0"></omgdc:Bounds> 46 </bpmndi:BPMNShape> 47 <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> 48 <omgdi:waypoint x="367.0" y="85.0"></omgdi:waypoint> 49 <omgdi:waypoint x="367.0" y="150.0"></omgdi:waypoint> 50 </bpmndi:BPMNEdge> 51 <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> 52 <omgdi:waypoint x="367.0" y="205.0"></omgdi:waypoint> 53 <omgdi:waypoint x="367.0" y="260.0"></omgdi:waypoint> 54 </bpmndi:BPMNEdge> 55 <bpmndi:BPMNEdge bpmnElement="经费大于等于10000" id="BPMNEdge_经费大于等于10000"> 56 <omgdi:waypoint x="347.0" y="280.0"></omgdi:waypoint> 57 <omgdi:waypoint x="173.0" y="280.0"></omgdi:waypoint> 58 <omgdi:waypoint x="172.0" y="360.0"></omgdi:waypoint> 59 <bpmndi:BPMNLabel> 60 <omgdc:Bounds height="42.0" width="100.0" x="191.0" y="260.0"></omgdc:Bounds> 61 </bpmndi:BPMNLabel> 62 </bpmndi:BPMNEdge> 63 <bpmndi:BPMNEdge bpmnElement="经费大于1000小于10000" id="BPMNEdge_经费大于1000小于10000"> 64 <omgdi:waypoint x="367.0" y="300.0"></omgdi:waypoint> 65 <omgdi:waypoint x="367.0" y="360.0"></omgdi:waypoint> 66 <bpmndi:BPMNLabel> 67 <omgdc:Bounds height="42.0" width="100.0" x="380.0" y="309.0"></omgdc:Bounds> 68 </bpmndi:BPMNLabel> 69 </bpmndi:BPMNEdge> 70 <bpmndi:BPMNEdge bpmnElement="缺省值" id="BPMNEdge_缺省值"> 71 <omgdi:waypoint x="387.0" y="280.0"></omgdi:waypoint> 72 <omgdi:waypoint x="582.0" y="280.0"></omgdi:waypoint> 73 <omgdi:waypoint x="582.0" y="360.0"></omgdi:waypoint> 74 <bpmndi:BPMNLabel> 75 <omgdc:Bounds height="14.0" width="36.0" x="519.0" y="260.0"></omgdc:Bounds> 76 </bpmndi:BPMNLabel> 77 </bpmndi:BPMNEdge> 78 <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"> 79 <omgdi:waypoint x="172.0" y="415.0"></omgdi:waypoint> 80 <omgdi:waypoint x="367.0" y="490.0"></omgdi:waypoint> 81 </bpmndi:BPMNEdge> 82 <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"> 83 <omgdi:waypoint x="367.0" y="415.0"></omgdi:waypoint> 84 <omgdi:waypoint x="367.0" y="490.0"></omgdi:waypoint> 85 </bpmndi:BPMNEdge> 86 <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"> 87 <omgdi:waypoint x="582.0" y="415.0"></omgdi:waypoint> 88 <omgdi:waypoint x="367.0" y="490.0"></omgdi:waypoint> 89 </bpmndi:BPMNEdge> 90 </bpmndi:BPMNPlane> 91 </bpmndi:BPMNDiagram> 92 </definitions>
二、发布流程
1 /** 2 * 2、发布一个流程 3 */ 4 @Test 5 public void testDeployProcess() { 6 RepositoryService repositoryService = processEngine.getRepositoryService(); 7 DeploymentBuilder builder = repositoryService.createDeployment(); 8 // 加载发布资源 9 builder.name("判断分支结点流程测试") // 设置流程显示别名 10 .addClasspathResource("travel.bpmn") // 设置流程规则文件 11 .addClasspathResource("travel.png"); // 设置流程规则的图片 12 // 发布流程 13 builder.deploy(); 14 }
三、运行、测试流程
1 /** 2 * 3、启动流程、执行任务,并查看状态 3 */ 4 @Test 5 public void testExcusiveGateway() { 6 // 获取服务对象的实例 7 RuntimeService runtimeService = processEngine.getRuntimeService(); 8 9 String processDefinitionKey = "确定旅游地点"; 10 // 自动执行与Key相对应的流程的最高版本 11 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey); 12 13 String processInstanceId = processInstance.getId(); 14 logger.info("processInstanceId:" + processInstance.getId()); 15 16 //获取当前流程下Execution对象 17 Execution e1 = runtimeService 18 .createExecutionQuery() 19 .processInstanceId(processInstanceId) //每个流程的唯一标识 20 .activityId("申请旅游经费") //每个活动的唯一标识 21 .singleResult(); 22 Assert.assertNotNull(e1); 23 //执行逻辑,请领导批示旅游经费 24 Double money =11500d; 25 //把金额放入变量中 26 runtimeService.setVariable(e1.getId(), "money", money); 27 logger.info("领导批示的旅游经费是: " + money); 28 29 //推动流程流转 30 logger.info("executionId: " + e1.getId()); 31 runtimeService.signal(e1.getId()); 32 33 if (money >= 10000d) { 34 Execution e2 = runtimeService 35 .createExecutionQuery() 36 .processInstanceId(processInstanceId) //每个流程的唯一标识 37 .activityId("国外游") //每个活动的唯一标识 38 .singleResult(); 39 Assert.assertNotNull(e2); 40 logger.info("由于领导指示的经费是:" + runtimeService.getVariable(e2.getId(), "money") + ",所以你可以国外游!" ); 41 42 //推动流程流转 43 runtimeService.signal(e2.getId()); 44 } else if ( money > 1000d && money < 10000d ) { 45 Execution e2 = runtimeService 46 .createExecutionQuery() 47 .processInstanceId(processInstanceId) //每个流程的唯一标识 48 .activityId("国内游") //每个活动的唯一标识 49 .singleResult(); 50 Assert.assertNotNull(e2); 51 logger.info("由于领导指示的经费是:" + runtimeService.getVariable(e2.getId(), "money") + ",所以你可以国内游!" ); 52 53 //推动流程流转 54 runtimeService.signal(e2.getId()); 55 } else { 56 Execution e2 = runtimeService 57 .createExecutionQuery() 58 .processInstanceId(processInstanceId) //每个流程的唯一标识 59 .activityId("省内游") //每个活动的唯一标识 60 .singleResult(); 61 Assert.assertNotNull(e2); 62 logger.info("由于领导指示的经费是:" + runtimeService.getVariable(e2.getId(), "money") + ",所以你可以省内游!" ); 63 64 //推动流程流转 65 runtimeService.signal(e2.getId()); 66 } 67 68 //检查结束状态 69 ProcessInstance pInstance = runtimeService 70 .createProcessInstanceQuery() 71 .processInstanceId(processInstanceId) 72 .singleResult(); 73 Assert.assertNull(pInstance); 74 logger.info("判断分支结点流程成功执行!"); 75 }
四、运行结果
[INFO][2015-12-02 14:39:58,335][com.mcs.activiti.test.TestExclusiveGateway]processInstanceId:170001
[INFO][2015-12-02 14:39:58,641][com.mcs.activiti.test.TestExclusiveGateway]领导批示的旅游经费是: 11500.0
[INFO][2015-12-02 14:39:58,642][com.mcs.activiti.test.TestExclusiveGateway]executionId: 170001
[INFO][2015-12-02 14:39:58,816][com.mcs.activiti.test.TestExclusiveGateway]由于领导指示的经费是:11500.0,所以你可以国外游!
[INFO][2015-12-02 14:39:58,914][com.mcs.activiti.test.TestExclusiveGateway]判断分支结点流程成功执行!