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是錯誤的,不可以使用的。

驗證還是很有必要使用的,因為流程部署的時候,我們最好驗證一次,沒有問題在部署。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM