前提:
1. 已经部署Activiti-Modeler设计工具
2. 已经完成配置和部署Activiti流程引擎
3. 能够正常通过Modeler设计工具完成创建流程图并保存到数据库
如果以上项目还未完成,请参考本专栏其他相关文章(还没写呢)
正文
众所周知,Activiti-Explorer设计工具生成的是JSON格式数据,但是睿智的Activiti引擎的RepositoryService在部署流程时是不认自家设计器生成的JSON数据的,所以当我们妄图通过设计器直接完成流程的部署时就会非常的尴尬。
但是天无绝人之路,Activiti提供了BpmnJsonConverter工具和BpmnXMLConverter工具,由设计工具产出的JSON格式数据可以通过BpmnJsonConverter工具先转换成BpmnModel对象,然后通过BpmnModel对象转换为XML数据(其实BpmnModel对象是可以直接部署的,但是如果需要保存和传输XML数据的话就不太方便了)
使用方法如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//先以model id作为查询参数得到Model对象
RepositoryService repositoryService = processEngine.getRepositoryService();
ModelQuery modelQuery = repositoryService.createModelQuery().modelId(id);
Model model = modelQuery.singleResult();
if (model == null) {
return null;
}
//jackson把Model对象转为JSON对象
ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
new String(repositoryService.getModelEditorSource(model.getId()), StandardCharsets.UTF_8));
//先转为BpmnModel
BpmnJsonConverter converter = new BpmnJsonConverter();
BpmnModel bpmnModel = converter.convertToBpmnModel(editorJsonNode);
//然后转为XML
BpmnXMLConverter xmlConvert = new BpmnXMLConverter();
byte[] xml = xmlConvert.convertToXML(bpmnModel);
System.out.println(new String(xml));
//最后完成部署,部署的时候name必须附带".bpmn20.xml"后缀
repositoryService.createDeployment()
.name(model.getName()).addString(model.getName() + ".bpmn20.xml", new String(xml)).deploy();
实现效果:
act_re_model表(此表中的deploymentId是空的)
act_re_deployment表
act_re_prodef表
踩坑
JSON对象转XML之后可能存在Process标记没有id值的问题,导致NCname值不合法,所以需要给他手动加上,这个值在数据库中是key的值,可以根据自己的需求进行修改,我是这样解决的。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); ModelQuery modelQuery = repositoryService.createModelQuery().modelId(id); Model model = modelQuery.singleResult(); if (model == null) { return null; } ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( new String(repositoryService.getModelEditorSource(model.getId()), StandardCharsets.UTF_8)); BpmnJsonConverter converter = new BpmnJsonConverter(); BpmnModel bpmnModel = converter.convertToBpmnModel(editorJsonNode); List<Process> processes = bpmnModel.getProcesses(); int i=0; for (Process process : processes) { process.setId("process"+i); i++; } BpmnXMLConverter xmlConvert = new BpmnXMLConverter(); byte[] xml = xmlConvert.convertToXML(bpmnModel); System.out.println(new String(xml)); return repositoryService.createDeployment().name(model.getName()).addString(model.getName() + ".bpmn20.xml", new String(xml)).deploy();