• activiti bpmnModel使用


    bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套activiti web设计器,如下图所示:

     

    当activiti web设计器设计的时候,存储格式是自定义的json对象,那现在问题来了,我们怎么把我们自己的json格式转化为标准的bpmn需要的xml文件呢?这一点很重要?所以这也是本节课需要重点讲解的地方,大家实际开发可以举一反三。灵活的运用到项目中。

    1.1.1. BpmnModel使用

    因为平时我们在使用的时候,展示流程图没有使用是默认的流程生成的这种方式,所以这里坐标信息,暂时不演示,主要演示节点等的核心功能。

    1.1.1.1. eclipse绘制流程

    为了方便演示,这里我们先在eclipse中绘制一个简单的流程。具体的流程图如下:

     

    流程图的xml文件如下:直接用文本打开bpmn文件即可:

    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="process1" isExecutable="true">
    4.  
      <startEvent id="start1shareniu" name="start1shareniu"></startEvent>
    5.  
      <sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow>
    6.  
      <userTask id="userTask1shareniu" name="userTask1shareniu"></userTask>
    7.  
      <sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow>
    8.  
      <endEvent id="endEventshareniu" name="endEventshareniu"></endEvent>
    9.  
      </process>
    10.  
      <bpmndi:BPMNDiagram id="BPMNDiagram_process1">
    11.  
      <bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1">
    12.  
      <bpmndi:BPMNShape bpmnElement="start1shareniu" id="BPMNShape_start1shareniu">
    13.  
      <omgdc:Bounds height="35.0" width="35.0" x="70.0" y="150.0"></omgdc:Bounds>
    14.  
      </bpmndi:BPMNShape>
    15.  
      <bpmndi:BPMNShape bpmnElement="userTask1shareniu" id="BPMNShape_userTask1shareniu">
    16.  
      <omgdc:Bounds height="60.0" width="100.0" x="180.0" y="110.0"></omgdc:Bounds>
    17.  
      </bpmndi:BPMNShape>
    18.  
      <bpmndi:BPMNShape bpmnElement="endEventshareniu" id="BPMNShape_endEventshareniu">
    19.  
      <omgdc:Bounds height="35.0" width="35.0" x="380.0" y="76.0"></omgdc:Bounds>
    20.  
      </bpmndi:BPMNShape>
    21.  
      <bpmndi:BPMNEdge bpmnElement="starttouserTask" id="BPMNEdge_starttouserTask">
    22.  
      <omgdi:waypoint x="87.0" y="150.0"></omgdi:waypoint>
    23.  
      <omgdi:waypoint x="100.0" y="139.0"></omgdi:waypoint>
    24.  
      <omgdi:waypoint x="180.0" y="140.0"></omgdi:waypoint>
    25.  
      <bpmndi:BPMNLabel>
    26.  
      <omgdc:Bounds height="14.0" width="100.0" x="87.0" y="150.0"></omgdc:Bounds>
    27.  
      </bpmndi:BPMNLabel>
    28.  
      </bpmndi:BPMNEdge>
    29.  
      <bpmndi:BPMNEdge bpmnElement="userTasktoend" id="BPMNEdge_userTasktoend">
    30.  
      <omgdi:waypoint x="280.0" y="140.0"></omgdi:waypoint>
    31.  
      <omgdi:waypoint x="324.0" y="129.0"></omgdi:waypoint>
    32.  
      <omgdi:waypoint x="324.0" y="93.0"></omgdi:waypoint>
    33.  
      <omgdi:waypoint x="380.0" y="93.0"></omgdi:waypoint>
    34.  
      <bpmndi:BPMNLabel>
    35.  
      <omgdc:Bounds height="14.0" width="100.0" x="414.0" y="126.0"></omgdc:Bounds>
    36.  
      </bpmndi:BPMNLabel>
    37.  
      </bpmndi:BPMNEdge>
    38.  
      </bpmndi:BPMNPlane>
    39.  
      </bpmndi:BPMNDiagram>
    40.  
      </definitions>

    1.1.1.2. 自己生成

    下面的代码,就是生成这个bpmnmodel 核心代码,代码如下所示:

    1.  
      //实例化BpmnModel对象
    2.  
      BpmnModel bpmnModel=new BpmnModel();
    3.  
      //开始节点的属性
    4.  
      StartEvent startEvent=new StartEvent();
    5.  
      startEvent.setId("start1shareniu");
    6.  
      startEvent.setName("start1shareniu");
    7.  
      //普通的UserTask节点
    8.  
      UserTask userTask=new UserTask();
    9.  
      userTask.setId("userTask1shareniu");
    10.  
      userTask.setName("userTask1shareniu");
    11.  
      //结束节点属性
    12.  
      EndEvent endEvent=new EndEvent();
    13.  
      endEvent.setId("endEventshareniu");
    14.  
      endEvent.setName("endEventshareniu");
    15.  
      //连线信息
    16.  
      List<SequenceFlow> sequenceFlows=new ArrayList<SequenceFlow>();
    17.  
      List<SequenceFlow> toEnd=new ArrayList<SequenceFlow>();
    18.  
      SequenceFlow s1=new SequenceFlow();
    19.  
      s1.setId("starttouserTask");
    20.  
      s1.setName("starttouserTask");
    21.  
      s1.setSourceRef("start1shareniu");
    22.  
      s1.setTargetRef("userTask1shareniu");
    23.  
      sequenceFlows.add(s1);
    24.  
      SequenceFlow s2=new SequenceFlow();
    25.  
      s2.setId("userTasktoend");
    26.  
      s2.setName("userTasktoend");
    27.  
      s2.setSourceRef("userTask1shareniu");
    28.  
      s2.setTargetRef("endEventshareniu");
    29.  
      toEnd.add(s2);
    30.  
      startEvent.setOutgoingFlows(sequenceFlows);
    31.  
      userTask.setOutgoingFlows(toEnd);
    32.  
      userTask.setIncomingFlows(sequenceFlows);
    33.  
      endEvent.setIncomingFlows(toEnd);
    34.  
      //Process对象
    35.  
      Process process=new Process();
    36.  
      process.setId("process1");
    37.  
      process.addFlowElement(startEvent);
    38.  
      process.addFlowElement(s1);
    39.  
      process.addFlowElement(userTask);
    40.  
      process.addFlowElement(s2);
    41.  
      process.addFlowElement(endEvent);
    42.  
      bpmnModel.addProcess(process);

    上面的代码,我们已经写好了bpmnmodel绘制的流程,那我们怎么知道对还是不对呢?下面就开始将我们的bpmnmodel对象转化为标准的xml文件看一下。

    1.1.2. BpmnModel转化xml

    将上面的对象转化为标准的xml代码如下所示:

    //bpmnModel 转换为标准的bpmn xml文件

    BpmnXMLConverter bpmnXMLConverter=new BpmnXMLConverter();

    byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);

    String bytes=new String(convertToXML);

    System.out.println(bytes);

    运行程序,看一下程序的输出如下:

    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="process1" isExecutable="true">
    4.  
      <startEvent id="start1shareniu" name="start1shareniu"></startEvent>
    5.  
      <sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow>
    6.  
      <userTask id="userTask1shareniu" name="userTask1shareniu"></userTask>
    7.  
      <sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow>
    8.  
      <endEvent id="endEventshareniu" name="endEventshareniu"></endEvent>
    9.  
      </process>
    10.  
      <bpmndi:BPMNDiagram id="BPMNDiagram_process1">
    11.  
      <bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"></bpmndi:BPMNPlane>
    12.  
      </bpmndi:BPMNDiagram>
    13.  
      </definitions>

    我们看到转化的xml文件,对比eclipse绘制流程的xml,除了坐标没有,其他的都是正确的。那我们怎么验证我们生成的xml是正确的呢?因为转化成功,也不一定可以使用的。接下来看一下bpmnmodel如何验证。

    1.1.3. BpmnModel验证

    验证的方法代码如下所示:

    //验证bpmnModel 是否是正确的bpmn xml文件

    ProcessValidatorFactory processValidatorFactory=new ProcessValidatorFactory();

    ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();

    //验证失败信息的封装ValidationError

    List<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);

    System.out.println(validate.size());

    需要说明的是:ValidationError封装的是验证信息,如果size为0说明,bpmnmodel正确,大于0,说明自定义的bpmnmodel是错误的,不可以使用的。

    验证还是很有必要使用的,因为流程部署的时候,我们最好验证一次,没有问题在部署。

  • 相关阅读:
    mysql脚本导入导出
    centos6.9关闭防火墙
    hdfs 架构
    MySQL JOIN的使用
    六种方式,教你在SpringBoot初始化时搞点事情!
    mybatis快速入门
    有了Swagger2,再也不用为写Api文档头疼了
    kafka查看Topic列表及消费状态等常用命令
    @RequestMapping注解
    寻找写代码感觉(三)之使用 Spring Boot 编写接口
  • 原文地址:https://www.cnblogs.com/sea520/p/13656620.html
Copyright © 2020-2023  润新知