实战:流程管理
功能需求:首先查询出所有部署的流程信息,上传流程图后自动部署,重新查询部署的流程信息。可以查看流程图以及删除流程信息。
查询流程定义信息
@RequestMapping("process/queryProcessDefPageList")
public List<Map<String, Object>> queryProcessDefPageList(@RequestBody Map<String ,Object> paramMap){
Integer startIndex = (Integer) paramMap.get("startIndex");
Integer pagesize = (Integer) paramMap.get("pagesize");
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> processDefinitions = processDefinitionQuery.listPage(startIndex, pagesize);
List<Map<String,Object>> res = new ArrayList<>();
for (ProcessDefinition pd : processDefinitions) {
Map<String,Object> map = new HashMap<>();
map.put("pdId",pd.getId());
map.put("pdName",pd.getName());
map.put("pdVersion",pd.getVersion());
map.put("pdKey",pd.getKey());
map.put("pdDeploymentId",pd.getDeploymentId());
res.add(map);
}
return res;
}
上传流程图
服务消费者接收上传的流程图:
/**
* 上传表单处理
*/
@ResponseBody
@RequestMapping("process/procDefUpload")
public Object upload(HttpServletRequest request){
start();
try {
MultipartRequest req = (MultipartRequest) request;
MultipartFile file = req.getFile("procDefFile");
String uuid = UUID.randomUUID().toString();
//获得上传上来的原始文件名
String fileName = file.getOriginalFilename();
//创建一个临时文件 用于传输到远程服务
final File tempFile = File.createTempFile(uuid,fileName.substring(fileName.lastIndexOf(".")));
file.transferTo(tempFile);
FileSystemResource resource = new FileSystemResource(tempFile);
MultiValueMap<String,Object> param = new LinkedMultiValueMap<String,Object>();
param.add("pdfile",resource);
String s = restTemplate.postForObject("http://lecrowdfunding-activity-service/act/deploy",param,String.class);
tempFile.delete();
success(true);
} catch (IOException e) {
e.printStackTrace();
}
return end();
}
服务提供者接收文件:
@RequestMapping("/act/deploy")
public String depolyProcDef( @RequestParam("pdfile") MultipartFile file ) {
start();
try {
// 部署流程定义图形
repositoryService
.createDeployment()
.addInputStream(file.getOriginalFilename(), file.getInputStream())
//.addClasspathResource(file.getOriginalFilename())
.deploy();
success(true);
} catch ( Exception e ) {
e.printStackTrace();
success(false);
}
return "成功";
}
查看流程定义图片
html部分:
<img id="procDefImg" src="/ztree/img/loading.gif">
$("#procDefImg").attr("src", "${APP_PATH}/process/loadImg?pdId=${RequestParameters['pdId']}");
会自动向后台发起请求请求图片 由于后台数据库中是以流的方式存储,那么直接以流的方式返回就前台就可以解析成对应的图片。
服务消费者Controller:
/**
* 加载流程图
* 以流的方式返回
*/
@RequestMapping("process/loadImg")
public void loadImg(@RequestParam("pdId") String pdId, HttpServletResponse resp) throws IOException {
// 通过响应对象返回图形信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_PNG);
//请求远程服务 服务返回一个字节数组
String url = "http://lecrowdfunding-activity-service/act/loadImgById/" + pdId;
ResponseEntity<byte[]> response =
restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<byte[]>(headers), byte[].class);
byte[] result = response.getBody();
InputStream in = new ByteArrayInputStream(result);
OutputStream out = resp.getOutputStream();
int i = -1;
while ((i = in.read()) != -1) {
out.write(i);
}
}
服务提供者Controller:
@RequestMapping("act/loadImgById/{id}")
public byte[] loadImgById(@PathVariable("id")String id) {
// 部署ID ==> 流程定义ID
// 从数据库中读取流程定义的图片
//根据流程部署id和部署资源名称获取部署图片的输入流。
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
ProcessDefinition pd = query.processDefinitionId(id).singleResult();
InputStream in =
repositoryService.getResourceAsStream(pd.getDeploymentId(),pd.getDiagramResourceName());
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
try {
while ((rc = in.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
} catch (IOException e) {
e.printStackTrace();
}
byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果
return in_b;
}
删除流程信息
服务消费者:
/**
* 删除流程定义
* @return
*/
@ResponseBody
@RequestMapping("process/deleteDeployment")
public Object deleteDeployment(String pdDeploymentId){
Object o = processService.deleteDeployment(pdDeploymentId);
return o;
}
服务提供者Controller:
/**
* 删除流程
* @param pdDeploymentId :流程部署id
*/
@RequestMapping("process/deleteDeployment")
public Object deleteDeployment(@RequestParam("pdDeploymentId")String pdDeploymentId){
start();
try {
repositoryService.deleteDeployment(pdDeploymentId, true); //流程部署id. 级联删除.
success(true);
} catch ( Exception e ) {
e.printStackTrace();
success(false);
}
return end();
}