美文网首页
activiti6.0流程引擎部署方式之BpmnModel以及使

activiti6.0流程引擎部署方式之BpmnModel以及使

作者: 我有一只喵喵 | 来源:发表于2019-03-27 10:03 被阅读0次

    activiti流程引擎部署方式之BpmnModel以及使用

    一、模型架构概览

    在流程资源文件中,每一个节点元素在activiti中都有对应的元素属性承载类,比如,UserTask任务节点,它的元素属性承载类为UserTask,相同,startEvent开始节点的元素承载类为StartEvent,在bpmn流程文件进行解析时,也是将xml文档中每个元素解析为对应的承载类,从而进行组装成一个BmpnModel模型,我们可以直接由activiti将bpmn xml文件解析为一个实例模型(下图所示),也可以完成通过自定义手动创建模型。

    BpmnModel.png

    二、BpmnModel模型部署实战

    2.1、自定义BpmnModel模型实战

    2.1.1、业务流程图
    业务流程图.png
    2.1.2、流程文档xml描述
      <process id="myProcess" name="My process" isExecutable="true">
        <startEvent id="startevent1" name="Start"></startEvent>
        <userTask id="usertask1" name="提交审批"></userTask>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
        <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
        <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="exclusivegateway1"></sequenceFlow>
        <userTask id="usertask2" name="总经理审批"></userTask>
        <sequenceFlow id="flow3" name="大于三天" sourceRef="exclusivegateway1" targetRef="usertask2">
          <conditionExpression xsi:type="tFormalExpression"><![CDATA[${day>3}]]></conditionExpression>
        </sequenceFlow>
        <userTask id="usertask3" name="部门经理审批"></userTask>
        <sequenceFlow id="flow4" name="小于三天" sourceRef="exclusivegateway1" targetRef="usertask3">
          <conditionExpression xsi:type="tFormalExpression"><![CDATA[${day<=3}]]></conditionExpression>
        </sequenceFlow>
        <endEvent id="endevent2" name="End"></endEvent>
        <sequenceFlow id="flow6" sourceRef="usertask2" targetRef="endevent2"></sequenceFlow>
        <sequenceFlow id="flow7" sourceRef="usertask3" targetRef="endevent2"></sequenceFlow>
      </process>
    
    2.1.3、自定义BpmnModel
       @Test
       public void genarateBpmnModel(){
           //创建BpmnModel对象
           BpmnModel bpmnModel = new BpmnModel();
    
           /**
            * 创建process节点 并添加至process
            * <process id="myProcess" name="My process" isExecutable="true">
            */
           Process process = new Process();
           //executabl内置默认为true
           process.setId("myProcess");
           process.setName("My process");
    
    
           /**
            * 创建开始结束节点 并添加至process
            * <startEvent id="startevent1" name="Start"></startEvent>
            * <endEvent id="endevent2" name="End"></endEvent>
            */
           StartEvent startEvent = new StartEvent();
           startEvent.setId("startevent1");
           startEvent.setName("Start");
    
           EndEvent endEvent = new EndEvent();
           endEvent.setId("endevent2");
           endEvent.setName("End");
    
           process.addFlowElement(startEvent);
           process.addFlowElement(endEvent);
    
           /**
            * 创建任务节点 并添加至process
            * <userTask id="usertask1" name="提交审批"></userTask>
            */
           UserTask userTask1 = genarateUserTask("usertask1","提交审批");
           UserTask userTask2 = genarateUserTask("usertask2","总经理审批");
           UserTask userTask3 = genarateUserTask("usertask3","部门经理审批");
    
           process.addFlowElement(userTask1);
           process.addFlowElement(userTask2);
           process.addFlowElement(userTask3);
           /**
            * 创建排他网关 并添加至process
            * <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
            */
           ExclusiveGateway exclusiveGateway = genarateExclusiveGateway("exclusivegateway1","Exclusive Gateway");
    
           process.addFlowElement(exclusiveGateway);
    
           /**
            * 创建连线 并添加至process
            * <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
            */
           SequenceFlow sequenceFlow1 = genarateSequenceFlow("flow1","","startevent1","usertask1","",process);
           process.addFlowElement(sequenceFlow1);
           /**
            * 创建连线 并添加至process
            * <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="exclusivegateway1"></sequenceFlow>
            */
           SequenceFlow sequenceFlow2 = genarateSequenceFlow("flow2","","usertask1","exclusivegateway1","",process);
           process.addFlowElement(sequenceFlow2);
    
           /**
            * 创建连线 并添加至process
            * <sequenceFlow id="flow3" name="大于三天" sourceRef="exclusivegateway1" targetRef="usertask2">
            *     <conditionExpression xsi:type="tFormalExpression"><![CDATA[${day>3}]]></conditionExpression>
            *  </sequenceFlow>
            */
           SequenceFlow sequenceFlow3 = genarateSequenceFlow("flow3","大于三天","exclusivegateway1","usertask2","${day>3}",process);
           process.addFlowElement(sequenceFlow3);
    
           /**
            * 创建连线 并添加至process
            * <sequenceFlow id="flow4" name="小于三天" sourceRef="exclusivegateway1" targetRef="usertask3">
            *    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${day<=3}]]></conditionExpression>
            *  </sequenceFlow>
            */
           SequenceFlow sequenceFlow4 = genarateSequenceFlow("flow4","小于三天","exclusivegateway1","usertask3","${day<=3}",process);
           process.addFlowElement(sequenceFlow4);
    
           /**
            * 创建连线 并添加至process
            *     <sequenceFlow id="flow6" sourceRef="usertask2" targetRef="endevent2"></sequenceFlow>
            *     <sequenceFlow id="flow7" sourceRef="usertask3" targetRef="endevent2"></sequenceFlow>
            */
           SequenceFlow sequenceFlow6 = genarateSequenceFlow("flow6","","usertask2","endevent2","",process);
           SequenceFlow sequenceFlow7 = genarateSequenceFlow("flow7","","usertask3","endevent2","",process);
           process.addFlowElement(sequenceFlow6);
           process.addFlowElement(sequenceFlow7);
    
           /**
            * 为排他网关添加出线
            */
           List<SequenceFlow> outgoingFlows = new ArrayList<>();
           outgoingFlows.add(sequenceFlow3);
           outgoingFlows.add(sequenceFlow4);
           exclusiveGateway.setOutgoingFlows(outgoingFlows);
    
           /**
            * 将process封装至模型对象
            */
           bpmnModel.addProcess(process);
    
    
       }
    
       /**
        * 创建连线
        */
       private SequenceFlow genarateSequenceFlow(String id, String name,String sourceRef, String tartgetRef, String conditionExpression, Process process) {
           SequenceFlow sequenceFlow = new SequenceFlow(sourceRef,tartgetRef);
           sequenceFlow.setId(id);
           if(name != null && name != ""){
               sequenceFlow.setName(name);
           }
           sequenceFlow.setSourceFlowElement(process.getFlowElement(sourceRef));
           sequenceFlow.setTargetFlowElement(process.getFlowElement(tartgetRef));
           if(conditionExpression !=null && conditionExpression != ""){
               sequenceFlow.setConditionExpression(conditionExpression);
           }
           return sequenceFlow;
       }
    
       /**
        * 创建排他网关
        */
       private ExclusiveGateway genarateExclusiveGateway(String id, String name) {
           ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
           exclusiveGateway.setId(id);
           exclusiveGateway.setName(name);
           return exclusiveGateway;
       }
    
       /**
        * 创建用户人物节点
        */
       private UserTask genarateUserTask(String id, String name) {
           UserTask userTask = new UserTask();
           userTask.setId(id);
           userTask.setName(name);
           return userTask;
       }
    
    2.1.4、模型正确性校验

    关于模型校验器更多细节可查看activiti源码剖析之BpmnModel模型校验器

            ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory();
            ProcessValidator processValidator = processValidatorFactory.createDefaultProcessValidator();
            List<ValidationError> validate = processValidator.validate(bpmnModel);
            if(validate.size()>=1){
                for (ValidationError validationError : validate) {
                    System.out.println(validationError.getProblem());
                    System.out.println(validationError.isWarning());
                }
            }
    

    2.2、BpmnModel模型部署实战

    Deployment deploy = deploymentBuilder.addBpmnModel("test.bpmn", bpmnModel).deploy();
    

    三、Bpmn模型相关使用实战

    • XML流程文档转化为BpmnModel
            //获取部署资源输入流
            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("process/delegateTest.bpmn");
    
            //deploymentBuilder.addInputStream("delegateTest.bpmn",inputStream).deploy();
            //创建转换器
            BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
    
            InputStreamProvider inputStreamProvider  = new InputStreamSource(inputStream);
    
            BpmnModel bpmnModel = bpmnXMLConverter.convertToBpmnModel(inputStreamProvider, true, false, "UTF-8");
    
    • BpmnModel转化为XML文档
            byte[] bytes = bpmnXMLConverter.convertToXML(bpmnModel);
    
            System.out.println(new String(bytes));
    
    • 数据库中存在的流程文档转化为模型
            String processDefinitionId = "delegateTest:1:4";
    
            BpmnModel bpmnModel = processEngine.getRepositoryService().getBpmnModel(processDefinitionId);
    
    • 获取流程文档坐标布局信息
            String processDefinitionId = "delegateTest:1:4";
    
            DiagramLayout processDiagramLayout = processEngine.getRepositoryService().getProcessDiagramLayout(processDefinitionId);
    
            Map<String, DiagramElement> elements = processDiagramLayout.getElements();
            Set<Map.Entry<String, DiagramElement>> entries = elements.entrySet();
            for (Map.Entry<String,DiagramElement> entry : entries){
                System.out.println(entry.getKey());
                System.out.println(entry.getValue());
            }
    
    • 获取流程节点信息
            String processDefinitionId = "delegateTest:1:4";
            //获取模型
            BpmnModel bpmnModel = processEngine.getRepositoryService().getBpmnModel(processDefinitionId);
            //获取流程Process
            Process process = bpmnModel.getProcesses().get(0);
            //获取指定类型节点
            List<UserTask> flowElementsOfType = process.findFlowElementsOfType(UserTask.class);
    
            for (UserTask userTask : flowElementsOfType) {
                System.out.println(userTask.getId());
            }
    

    相关文章

      网友评论

          本文标题:activiti6.0流程引擎部署方式之BpmnModel以及使

          本文链接:https://www.haomeiwen.com/subject/igyavqtx.html