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文件即可:

<?xml version="1.0" encoding="UTF-8"?>
<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"><process id="process1" isExecutable="true"><startEvent id="start1shareniu" name="start1shareniu"></startEvent><sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow><userTask id="userTask1shareniu" name="userTask1shareniu"></userTask><sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow><endEvent id="endEventshareniu" name="endEventshareniu"></endEvent></process><bpmndi:BPMNDiagram id="BPMNDiagram_process1"><bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"><bpmndi:BPMNShape bpmnElement="start1shareniu" id="BPMNShape_start1shareniu"><omgdc:Bounds height="35.0" width="35.0" x="70.0" y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="userTask1shareniu" id="BPMNShape_userTask1shareniu"><omgdc:Bounds height="60.0" width="100.0" x="180.0" y="110.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endEventshareniu" id="BPMNShape_endEventshareniu"><omgdc:Bounds height="35.0" width="35.0" x="380.0" y="76.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="starttouserTask" id="BPMNEdge_starttouserTask"><omgdi:waypoint x="87.0" y="150.0"></omgdi:waypoint><omgdi:waypoint x="100.0" y="139.0"></omgdi:waypoint><omgdi:waypoint x="180.0" y="140.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="87.0" y="150.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="userTasktoend" id="BPMNEdge_userTasktoend"><omgdi:waypoint x="280.0" y="140.0"></omgdi:waypoint><omgdi:waypoint x="324.0" y="129.0"></omgdi:waypoint><omgdi:waypoint x="324.0" y="93.0"></omgdi:waypoint><omgdi:waypoint x="380.0" y="93.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="414.0" y="126.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

1.1.1.2. 自己生成

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

//实例化BpmnModel对象
BpmnModel bpmnModel=new BpmnModel();
//开始节点的属性
StartEvent startEvent=new StartEvent();
startEvent.setId("start1shareniu");
startEvent.setName("start1shareniu");
//普通的UserTask节点
UserTask userTask=new UserTask();
userTask.setId("userTask1shareniu");
userTask.setName("userTask1shareniu");
//结束节点属性
EndEvent endEvent=new EndEvent();
endEvent.setId("endEventshareniu");
endEvent.setName("endEventshareniu");
//连线信息
List<SequenceFlow> sequenceFlows=new ArrayList<SequenceFlow>();
List<SequenceFlow> toEnd=new ArrayList<SequenceFlow>();
SequenceFlow s1=new SequenceFlow();
s1.setId("starttouserTask");
s1.setName("starttouserTask");
s1.setSourceRef("start1shareniu");
s1.setTargetRef("userTask1shareniu");
sequenceFlows.add(s1);
SequenceFlow s2=new SequenceFlow();
s2.setId("userTasktoend");
s2.setName("userTasktoend");
s2.setSourceRef("userTask1shareniu");
s2.setTargetRef("endEventshareniu");
toEnd.add(s2);
startEvent.setOutgoingFlows(sequenceFlows);
userTask.setOutgoingFlows(toEnd);
userTask.setIncomingFlows(sequenceFlows);
endEvent.setIncomingFlows(toEnd);
//Process对象
Process process=new Process();
process.setId("process1");
process.addFlowElement(startEvent);
process.addFlowElement(s1);
process.addFlowElement(userTask);
process.addFlowElement(s2);
process.addFlowElement(endEvent);
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);

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

<?xml version="1.0" encoding="UTF-8"?>
<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"><process id="process1" isExecutable="true"><startEvent id="start1shareniu" name="start1shareniu"></startEvent><sequenceFlow id="starttouserTask" name="starttouserTask" sourceRef="start1shareniu" targetRef="userTask1shareniu"></sequenceFlow><userTask id="userTask1shareniu" name="userTask1shareniu"></userTask><sequenceFlow id="userTasktoend" name="userTasktoend" sourceRef="userTask1shareniu" targetRef="endEventshareniu"></sequenceFlow><endEvent id="endEventshareniu" name="endEventshareniu"></endEvent></process><bpmndi:BPMNDiagram id="BPMNDiagram_process1"><bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

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

1.1.3. BpmnModel验证

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

//验证bpmnModel 是否是正确的bpmn xml文件ProcessValidatorFactory processValidatorFactory=new ProcessValidatorFactory();ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();//验证失败信息的封装ValidationErrorList<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);System.out.println(validate.size());

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

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

转载于:https://www.cnblogs.com/zhjh256/p/10021352.html

activiti5/6 系列之--BpmnModel使用相关推荐

  1. java activiti5_工作流Activiti5.13学习笔记(一)

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

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

    工作流Activiti5.13学习笔记(一) 了解工作流 1.工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个 ...

  3. activiti5.22整合官方编辑器

    环境 activiti:5.22.0 springboot:2.5.1 前言 默认已经Springboot2整合activiti5完毕: 可以参考:springboot2整合activiti5.22 ...

  4. activiti5、activiti6、activiti7、flowable、camunda7、camunda8流程引擎对比分析和选型参考

    常见的开源工作流引擎有哪些?该如何选择?市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda,其中activiti又有activiti5.a ...

  5. 妙用postman系列——postman建组、分享

    妙用postman系列--postman建组.分享 添加新的组和请求. 3.生成分享链接 4.导入分享链接

  6. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  7. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  8. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  9. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

最新文章

  1. 缩略图在网页设计中应用的35个优秀案例
  2. Mysql中S 锁和 X 锁的区别
  3. crossdomain.xml配置错误导致登录不了
  4. golang 切片 接口_Go 经典入门系列 18:接口(一)
  5. 元宇宙该如何发展才不会变为泡沫
  6. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
  7. quad8是matlab中调用那个,Matlab 数值积分
  8. wait放弃对象锁_终于搞懂了sleep/wait/notify/notifyAll,真的是不容易
  9. 【C#学习笔记】单精度和双精度浮点型操作留意。
  10. 心理正常与异常的区分_心理正常与心理异常区分三原则
  11. Questions make me doubt my engineer career
  12. 类查找android中跨项目的数据库操作ContentProvider的使用
  13. 【关系抽取】详聊如何用BERT实现关系抽取
  14. win10企业版激活简便方法
  15. 是否可以将现有图表导入到 think-cell?
  16. 从Master到百度《最强大脑》人机大战:AI成坊间话题意味着什么?
  17. Docker 文件映射
  18. 使用命令符关闭笔记本自带键盘命令
  19. win7计算机里没有桌面快捷方式,Win7桌面快捷方式图标消失的解决办法
  20. 这4款神级软件 最好用的软件

热门文章

  1. OSPF-网络类型(ip ospf network ?)
  2. 流水账,从我开始接触计算机时写起
  3. python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码
  4. 热闹的聚会与尴尬的聚会_如何增加(和保存)您最喜欢的技术聚会
  5. 工业革命前数千年人口经济_我们已经进行了数千年的编程
  6. priority_queue 结构体的优先级设置
  7. c语言输入函数有什么作用,c语言的输入函数有哪些
  8. 小程序的ui应该怎么设计?
  9. 什么是Python?主要运用哪些方面?
  10. Python培训教程:Python内置数据结构之双向队列