Activiti流程图做好后,我们需要把它部署到系统中,这样才能在系统中启动流程,以完成后续工作。部署流程有若干可行方法,这里根据我在项目中调试和正式使用的两种方法做一下简单的处理。
1、调试方法
该方法只在测试中使用
@Test
public void testActivitiHelloWorld(){
//括号内为流程图文件的路径
Deployment deployment = repositoryService.createDeployment().addClasspathResource("configs/activiti/xxx.bpmn").deploy();
}
2、实际使用
在实际使用时,我们不可能每次都去junit测试方法中测试,基本都会用到上传文件的方式。在这里,我是通过js上传文件到后台,再部署流程。(这里js上传方法就忽略了)。文件上传时会有上传多个文件的功能,所以把多文件上传写成Map集合。
用到多文件文件MultipartFile时,这里主要配置springmvc解析器CommonsMultipartResolver等,内容如下:
<!-- 上传文件时需要用到的分解层,默认将编码转为urf-8,设置最大上传容量 ,最大内存-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="defaultEncoding" value="UTF-8" /> <!-- 默认编码 (ISO-8859-1) -->
<property name="maxInMemorySize" value="20480" /> <!-- 最大内存大小 (10240),以byte为单位 -->
<property name="uploadTempDir" value="/WEB-INF/uploads/" /> <!-- 上传后的目录名 (WebUtils#TEMP_DIR_CONTEXT_ATTRIBUTE) -->
<property name="maxUploadSize" value="-1" /> <!-- 最大文件大小,-1为无限止(-1),以byte为单位 -->
</bean>
文件上传后,后台处理如下:
@RequestMapping("/deployXMLUpload")
@ResponseBody
public Map<String, Object> uploadFlowXml(MultipartHttpServletRequest request, ActionValueAssistant actionValueAssistant) {
Map<String, Object> result = new HashMap<String, Object>();
// 获取文件map集合
Map<String, MultipartFile> namemap = request.getFileMap();
// 循环遍历,取出单个文件
for(Map.Entry<String, MultipartFile> key:namemap.entrySet()) {
// 创建文件存放路径实例
String rootPath = request.getRealPath("files");
File fileDir = new File(rootPath, "deloyUpload");
// 判断文件夹不存在就创建
if(!fileDir.exists()) {
fileDir.mkdirs();
}
//getOriginalFilename() 获取上传文件的原名
File testFile= new File(fileDir, key.getValue().getOriginalFilename());
try {
//transferto()方法,是springmvc封装的方法,用于图片上传时,把内存中图片写入磁盘
key.getValue().transferTo(testFile);
//调用DeployXml(File deployFile)方法
boolean flag = wTWorkFlowOperationService.DeployXml(testFile);
if(flag) {
result.put("result", 1);
result.put("msg", "部署成功!");
}
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
result.put("result", 0);
result.put("msg", "部署失败!"+ e.getMessage());
}
}
return result;
}
DeployXml(File deployFile)方法如下:
/**
* 部署文件
* @param deployFile
* @return
*/
public boolean DeployXml(File deployFile){
try {
DeploymentBuilder deployBuilder = repositoryService.createDeployment();
String fileName = deployFile.getName();
if(fileName.endsWith(".xml") || fileName.endsWith(".bpmn")) {
//deployBuilder.addClasspathResource(deployFile.getAbsolutePath()).deploy();
deployBuilder.addInputStream(fileName, new FileInputStream(deployFile)).deploy();
}else if(fileName.endsWith(".zip") || fileName.endsWith(".bar")) {
try {
deployBuilder.addZipInputStream(new ZipInputStream(new FileInputStream(deployFile.getAbsolutePath()))).deploy();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
在这里,顺便说一下获取所有部署的流程:
/**
* 获取所有部署的流程图
* @return
*/
public List<Deployment> queryAllDeploy(){
return repositoryService.createDeploymentQuery().orderByDeploymenTime().desc().list();
}
public List<ProcessInstance> queryAllInstance() {
//return historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc().list();
return runtimeService.createProcessInstanceQuery().orderByProcessInstanceId().desc().list();
}