BpmnModel对象,是activiti动态部署中很重要的一个对象,如果BpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,使用bpmn-js使用前端或者C/S展现流程流转而不是使用工作流引擎,就显得力不从心。例如,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验证

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

  1. //验证bpmnModel 是否是正确的bpmn xml文件
  2.  
  3. ProcessValidatorFactory processValidatorFactory=new ProcessValidatorFactory();
  4.  
  5. ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();
  6.  
  7. //验证失败信息的封装ValidationError
  8.  
  9. List<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);
  10.  
  11. System.out.println(validate.size());

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

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

activiti5/6 系列之--BpmnModel使用的更多相关文章

  1. activiti5/6 系列之--Activiti 读取并转换BPMN2文件

    统一的BPMN标准,对工作流的流程定义采用BPMN统一格式.BPMN流程文件可以使用eclipse bpmn2插件开发比如eclipse bpmn2 modeler或者idea activiti插件. ...

  2. activiti5/6 系列之--Activiti与BPMN2.0规范相关节点对应关系

    根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subproce ...

  3. activiti5/6 系列之--流程复用技术 callActivity

    定义:当流程执行到callActivity,会创建一个新分支,它是到达调用节点的流程的分支. 这个分支会用来执行子流程,默认创建并行子流程,就像一个普通的流程. 上级流程会等待子流程完成,然后才会继续 ...

  4. activiti5.13工作流系列(一)-初识

    1.什么是工作流? 工作流就是让多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程,工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition) ...

  5. 工作流Activiti5.13学习笔记(一)

    了解工作流 1.工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某 ...

  6. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  8. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  9. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

随机推荐

  1. a排兵布阵

    来源hdu1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵 ...

  2. css之高度塌陷及其解决方法

    浅谈 清除浮动 的多种方式(clearfix) 1.什么是浮动 ? 是否脱离文档流? 1.普通流定位 static(默认方式) 普通流定位,又称为文档流定位,是页面元素的默认定位方式 页面中的块级元素 ...

  3. js的小知识7

    1.函数都有返回值...... 而方法的本质也是函数,所有也有返回值. Document.getElementById()返回的是获取的标签 getElementByClassName()和getEl ...

  4. Broadcast

    静态注册广播接收器 1. 活动中创建内部类继承BroadcastReceiver实现 onReceive函数 2. new 一个内部类的对象 3. registerReceiver注册内部类 4. 在 ...

  5. SpringBoot定时任务说明

    1. 定时任务实现方式 定时任务实现方式: Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行 ...

  6. git fork代码并修改胡提交到自己的git仓库

    最近在参加阿里天池大数据中间件比赛(毫无头绪,打酱油中).看参赛要求,需要将官网的git工程clone下来,在此基础上做修改后提交到自己的仓库中. 由于以前并没有使用过git,所以差了比较多的资料,做 ...

  7. linux ---部署django项目篇

    uWSGI + nginx+ django + virtualenv + supervisor发布web服务器 项目部署步骤 1.项目准备阶段 1.准备项目代码,从本地拷贝 2.将项目上传到linux ...

  8. iview form 表单的怪异小BUG

    当同一个弹窗中的表单重复利用时: 我原先的代码逻辑是: <Form :label-width="100" class="mt20" ref="c ...

  9. [Day11]接口、多态

    1.接口 (1)接口定义:interface关键字 ,所在文件仍然是.java文件,编译后仍产生.class文件.       定义格式 public interface 接口名{ 抽象方法1: 抽象 ...

  10. 大牛推荐的5本 Linux 经典必读书

    今天给大家推荐5本Linux学习相关的书籍:这些书籍基本都是很多大牛推荐过,并且深受业界好评的书:虽然只有5本,但是相信把5本全都认真看过的同学应该不多吧?希望这些书能够帮助你进阶为大牛! 上期传送门 ...