暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot 集成 Flowable 实现流程部署

ITSK 2021-03-07
2437
努力练就更短的时间完成质量保证的更多工作任务!高效工作,拒绝拖延!




最近工作需要使用Flowable流程引擎开发公司平台的企业级工作流,这块儿相对比较难据说Flowable坑也多,目前市面Flowable资料又少之又少,还没有找到相关书籍,有小伙伴有相关学习资料可以分享给笔者,一起探讨丫~~

刚刚开发不久已经踩了两个坑了,嗯哼遇到问题只能结合官方文档看源码琢磨,之前没有接触过,也挺好的也是一个挑战,笔者会在之后的文章将遇到的坑及解决方案做一一总结,分享给有需要的小伙伴

本篇文章先做个简单入门,由以下几方面构成:①BPMN介绍;②Flowable介绍;③SpringBoot【2.4.3】+Flowable【6.5.0】环境搭建;④实现流程部署;

强调!强调!强调!笔者使用的Flowable版本是6.5.0!


什么是BPMN?

我们看百度百科介绍:由BPMI(The Business Process Management Initiative)开发了一套标准叫业务流程建模符号(BPMN - Business Process Modeling Notation)。在 BPMI Notation Working Group超过2年的努力,于2004年5月对外发布了BPMN 1.0 规范。后BPMI并入到OMG组织,OMG于2011年推出BPMN2.0标准,对BPMN进行了重新定义(Business Process Model and Notation)。BPMN的主要目标是提供一些被所有业务用户容易理解的符号,从创建流程轮廓的业务分析到这些流程的实现,直到最终用户的管理监控。BPMN也支持提供一个内部的模型可以生成可执行的BPEL4WS。因此BPMN的出现,弥补了从业务流程设计到流程开发的间隙。

BPMN定义了一个业务流程图(Business Process Diagram),该业务流程图基于一个流程图(flowcharting),该流程图被设计用于创建业务流程操作的图形化模型。而一个业务流程模型(Business Process Model),指一个由图形对象(graphical objects)组成的网状图,图形对象包括活动(activities)和用于定义这些活动执行顺序的流程控制器(flow controls)。

大白话理解:BPMN是一套符号的标准,这些符号描述了如何做一个业务,并且这个业务在做的过程中被人监控和控制。业务人员和开发人员通过这套图形可以很好的完成协作。


什么是Flowable?

官方描述如下:Flowable提供了一个组高效的核心开源业务流程引擎,为开发人员,系统管理员和业务用户提供工作流和业务流程管理(BPM)平台。全部用Java编写,并且基于Apache 2.0许可的开源,代码在社区维护。其核心是一个快速,经过试验和测试的动态BPMN流程引擎,附带DMN决策表和CMMN Case管理引擎。

大白话理解:Flowable是BPMN的一个基于Java的软件实现,不过Flowable不仅仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有自己的用户管理、微服务API等一系列功能,是一个服务平台。

官方文档:https://flowable.com/open-source/docs/oss-introduction/

源码地址:https://github.com/flowable/flowable-engine


SpringBoot【2.4.3】+Flowable【6.5.0】环境搭建

引入依赖pom

 <properties>
<java.version>1.8</java.version>
<flowable.version>6.5.0</flowable.version>
<mysql.version>8.0.22</mysql.version>
</properties>


<dependencies>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--flowable依赖-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>${flowable.version}</version>
</dependency>
<!--数据库依赖-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

配置application.yml文件

spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/flowable-study?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8989


实现流程部署

新增流程部署接口,测试环境是否ok:

@RestController
@RequestMapping(value = "/flowable")
public class SyFlowController {


/**
* 流程服务
*/
@Autowired
private SyFlowService syFlowService;


@RequestMapping("/deployFlow")
@ResponseBody
public Map<String, String> deployFlow() {
Map<String, String> res = new HashMap<>();


String flowPath = "D:\\study\\flowable\\flowable.bpmn20.xml";


if (null == syFlowService.deployFlow(flowPath)) {
res.put("msg", "创建流程失败");
res.put("res", "0");
return res;
}
res.put("msg", "创建流程成功");
res.put("res", "1");
return res;
}
}

SyFlowService 提供流程部署服务:

     /**
* 部署工作流
*/
Deployment deployFlow(String filePath);

实现类如下:

@Service
public class SyFlowServiceImpl implements SyFlowService {


/**
* 日志类
*/
private static final Logger log = LoggerFactory.getLogger(SyFlowServiceImpl.class);


/**
* bpmn xml解析器
*/
private BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
/**
* Flowable repositoryService服务
*/
@Autowired
private RepositoryService repositoryService;


@Override
public Deployment deployFlow(String filePath) {


//解析BPMN模型看是否成功
XMLStreamReader reader = null;
InputStream inputStream = null;
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
inputStream = new FileInputStream(new File(filePath));
reader = factory.createXMLStreamReader(inputStream);
//校验bpmn xml文件是否异常
BpmnModel model = bpmnXMLConverter.convertToBpmnModel(reader);
List<Process> processes = model.getProcesses();
if (CollectionUtils.isEmpty(processes)) {
log.error("BPMN模型没有配置流程");
return null;
}


/**
* 获取流程定义信息
*/
Process mainProcess = model.getMainProcess();
//获取流程定义信息
//获取流程key
String id = mainProcess.getId();
System.out.println("流程定义key:" + id);
//获取流程名称
String name = mainProcess.getName();
System.out.println("流程定义名称:" + name);
//获取流程描述
String documentation = mainProcess.getDocumentation();
System.out.println("流程定义描述:" + documentation);
//获取process节点中的扩展属性信息
Map<String, List<ExtensionAttribute>> attributes = mainProcess.getAttributes();
for (Map.Entry<String, List<ExtensionAttribute>> entry : attributes.entrySet()) {
System.out.println("扩展属性key:" + entry.getKey() + ",对应的值:" + entry.getValue().get(0).getValue());
}


inputStream = new FileInputStream(new File(filePath));
Deployment deployment = repositoryService.createDeployment().name("TEST_FLOW.bpmn20.xml")
.addInputStream(mainProcess.getName(), inputStream).deploy();


log.warn("部署流程 name:" + mainProcess.getName() + " " + deployment);
return deployment;
} catch (Exception e) {
log.error("BPMN模型创建流程异常", e);
return null;
} finally {
try {
reader.close();
} catch (XMLStreamException e) {
log.error("关闭异常", e);
}
}
}
}

flowable.bpmn20.xml文件如下:

<?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:flowable="http://flowable.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.flowable.org/processdef">
<process id="test_bpmn" name="test BPMN" isExecutable="true">
<documentation>test BPMN</documentation>
<startEvent id="start" name="开始"></startEvent>
<endEvent id="end" name="结束"></endEvent>
<userTask id="testUser" name="usertask"></userTask>
<sequenceFlow id="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" sourceRef="start" targetRef="testUser"></sequenceFlow>
<sequenceFlow id="sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44" sourceRef="testUser" targetRef="end"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_test_bpmn">
<bpmndi:BPMNPlane bpmnElement="test_bpmn" id="BPMNPlane_test_bpmn">
<bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="30.0" width="30.0" x="210.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
<omgdc:Bounds height="28.0" width="28.0" x="525.0" y="61.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="testUser" id="BPMNShape_testUser">
<omgdc:Bounds height="80.0" width="100.0" x="315.0" y="35.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" id="BPMNEdge_sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002">
<omgdi:waypoint x="239.94999779398907" y="75.0"></omgdi:waypoint>
<omgdi:waypoint x="315.0" y="75.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44" id="BPMNEdge_sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44">
<omgdi:waypoint x="414.9499999999903" y="75.0"></omgdi:waypoint>
<omgdi:waypoint x="525.0" y="75.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>


创建数据库:flowable-study,utf8编码

第一次启动应用程序flowable会自动创建所需要的数据表:

创建完后mysql中的数据表如下:

测试运行结果

查看数据表数据
部署表act_re_deployment

部署内容表act_ge_bytearray

至此完成了flowable的流程部署操作。

长按二维码关注我们

ITSK

博客|yajing8


我知道你在看

文章转载自ITSK,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论