flowable工作流-BPMN流程部署
BPMN相关基础
在画流程图之前,首先需要了解BPMN的一些基础知识:开始、结束事件、用户任务、任务受让人、任务审核人、网关等一些基础知识,具体可以参考官方文档,介绍的很详细,也比较容易理解。BPMN介绍
画流程图
画流程图我是通过在线工具进行编辑。工作流在线编辑
简单的模拟了一个请假的流程图:任何一个流程都有开始节点和结束节点。发起人节点发起请假申请后,到达网关节点,根据请假天数,来判断需要组长或经理审批,组长或经理审批完成后,任务到达结束节点,流程结束。图例中,左侧有一些BPMN基本的组件,包括任务,网关、定时器,虽然不太全,不过可以完成日常的简单工作流程。当流程图画完后,点击xml页签,会有对应的xml信息。可以拷贝到我们的项目中,一个简单的流程就算设计完成。
部署 相关API
Deployment deploy = repositoryService.createDeployment().name(deploymentVo.getName())//部署名称.category(deploymentVo.getCategory())//类别.key(deploymentVo.getKey())//部署key.tenantId(deploymentVo.getTenantId())//租户Id.addInputStream(deploymentVo.getResourceName(),inputStream)//.addClasspathResource("path") 类文件资源.deploy();
部署可以通过类路径资源的方式,也可以通过文件流的方式两者类似。在项目中,我是通过上传文件上传的方式进行。在部署时,会首先验证文件是不是符合规范。
@PostMapping("/uploadAndDeploy")public CommonResult uploadAndDeploy(@RequestParam("file") MultipartFile multipartFile, ActReDeploymentParam param) {CommonResult result= CommonResult.error();try {result = deploymentService.createDeploy(param, multipartFile);} catch (IOException e) {e.printStackTrace();} catch (XMLStreamException e) {e.printStackTrace();}return result;}
public CommonResult createDeploy(ActReDeploymentParam info, MultipartFile multipartFile) throws IOException, XMLStreamException {String filename = multipartFile.getResource().getFilename();if(!filename.endsWith("bpmn20.xml")){return CommonResult.error("文件格式错误",null);}InputStream inputStream = multipartFile.getInputStream();XMLInputFactory xif = new XMLInputFactoryImpl();InputStreamReader xmlIn = new InputStreamReader(inputStream, "UTF-8");XMLStreamReader xtr =xif.createXMLStreamReader(xmlIn);BpmnModel bpmnModel = bpmnXmlConverter.convertToBpmnModel(xtr);//校验文件ProcessValidator validator = new ProcessValidatorFactory().createDefaultProcessValidator();List<ValidationError> errors = validator.validate(bpmnModel);if(!ObjectUtil.isEmpty(errors)){StringBuffer es = new StringBuffer();errors.forEach(ve -> es.append(ve.toString()).append("/n"));return CommonResult.error(errors);}Process mainProcess = bpmnModel.getMainProcess();String fileName = mainProcess.getName();if (StrUtil.isEmpty(fileName)) {return CommonResult.error(Const.ERROR_MSG,"\"No process found in definition \" + fileName");}info.setName(mainProcess.getName());info.setKey(mainProcess.getId());info.setResourceName(filename);InputStream sourceStream= multipartFile.getInputStream();Deployment deploy= flowApi.deployment(info,sourceStream);return CommonResult.success(deploy);}
.
Deployment deploy = repositoryService.createDeployment().name(deploymentVo.getName()).category(deploymentVo.getCategory()).key(deploymentVo.getKey()).tenantId(deploymentVo.getTenantId()).addInputStream(deploymentVo.getResourceName(),inputStream)//.addClasspathResource("path") 类文件资源.deploy();
发布成功后,数据库生成关于该流程的定义信息。主要涉及到的表:
:流程定义信息: :流程资源信息,包括xml文件的信息和对应流程图的信息。:流程部署信息
最后,如果有其他问题,欢迎加qq群交流~