O exemplo neste artigo mostra o método de implementação da visualização do fluxograma do Activiti. As etapas específicas são as seguintes:
1. O código da imagem de visualização do caso de teste é o seguinte:
public void viewImage() throws Exception { // Cria um objeto de serviço de warehouse RepositoryService RepositoryService = processEngine.getRepositoryService() // Encontre os arquivos que precisam ser exibidos no warehouse String deployId = "701" List<String> names =; repositórioService.getDeploymentResourceNames (deploymentId); String imageName = null para (String nome: nomes) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); /"+ imageName); // Obtém o fluxo de entrada do arquivo por meio do ID de implantação e do nome do arquivo InputStream in = repositoryService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile(in, f });
ilustrar:
1) deployId é o ID de implantação do processo
2) resourceName é o valor da coluna NAME_ na tabela act_ge_bytearray
3) Use o método getDeploymentResourceNames de RepositoryService para obter os nomes de todos os arquivos na implantação especificada
4) Use o método getResourceAsStream de RepositoryService para passar o ID de implantação e o nome do arquivo para obter o fluxo de entrada do arquivo com o nome especificado na implantação.
5) Para a operação final do fluxo de IO, use o método copyInputStreamToFile da ferramenta FileUtils para concluir a cópia do fluxo do processo para o arquivo.
2. Visualize a imagem na página de definição de processo no projeto web:
public String viewImage(){InputStream in = repositoryService.getResourceAsStream.getImageStream(deploymentId,imageName);//O projeto real do método aqui deve ser colocado no serviço HttpServletResponse resp = ServletActionContext.getResponse();try { OutputStream out = resp .getOutputStream() // Grava o processo de entrada da imagem no fluxo de saída resp byte[] b = new byte[1024]; for (int len = -1; (len= in.read(b))!=-1; ) { out.write(b, 0, len } // Fecha o fluxo); .close(); in.close();} catch (IOException e) { e.printStackTrace();}return null;}
ilustrar:
1) deployId é o ID de implantação do processo, imageName é o nome da imagem
2) Como a imagem é visualizada na página da lista de definição de processo, o id e imageName podem ser obtidos na definição do processo (ProcessDefinition) (String getDeploymentId(); e String getDiagramResourceName();)
3) Tag da página da web <a target="_blank" href="viewImage?deploymentId=1&imageName=imageName.png" rel="external nofollow" >Ver fluxograma</a>
3. Visualize o fluxograma atual do projeto web
public String viewCurrentImage(){ProcessDefinition pd = service.getProcessDefinitionByTaskId(taskId);// 1. Obtenha o ID de implantação do processo putContext("deploymentId", pd.getDeploymentId());// 2. Obtenha o nome da imagem do processo putContext ("imageName", pd.getDiagramResourceName());// 3. Obtenha as coordenadas da atividade atual Map<String,Object> currentActivityCoordinates =service.getCurrentActivityCoordinates(taskId);putContext("acs", currentActivityCoordinates);return "image";}
A implementação de código de service.getProcessDefinitionByTaskId(taskId);
public ProcessDefinition getProcessDefinitionByTaskId(String taskId) {// 1. Obtenha taskTask task = taskService.createTaskQuery().taskId(taskId).singleResult();// 2. Obtenha o objeto de definição de processo ProcessDefinition por meio do pdid do objeto de tarefa pd = repositórioService.getProcessDefinition (task.getProcessDefinitionId());return pd;}
A implementação de código de service.getCurrentActivityCoordens(taskId);
public Map<String, Object> getCurrentActivityCoordens(String taskId) {Map<String, Object> coordenadas = new HashMap<String, Object>(); // 1. Obtenha o IDTask atualmente ativo task = taskService.createTaskQuery().taskId ( taskId).singleResult();ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();String currentActivitiId = pi.getActivityId();// 2. Obtenha a definição do processo ProcessDefinitionEntity pd = (ProcessDefinitionEntity) repositórioService.getProcessDefinition(task.getProcessDefinitionId( )); // 3. Use a definição de processo para obter o objeto de atividade ActivityImpl por meio de currentActivitiId Activity = pd.findActivity(currentActivitiId);// 4. Obtenha as coordenadas da atividade coordenadas.put("x", Activity.getX()); put("y", atividade.getY());coordenadas.put("largura", atividade.getWidth());coordenadas.put("altura", Activity.getHeight());coordenadas de retorno;}
parte da página da imagem:
Na página da lista de tarefas pessoais, clique em <a target="_blank" href="/viewCurrentImage?taskId=1" rel="external nofollow" >Ver fluxograma atual</a> para ir para a seguinte página:
<body><!-- 1. Obtenha o fluxograma de regras Aqui usamos a tag strust2 para obter o valor colocado na pilha de valores acima--><img style="position: absoluto;top: 0px;esquerda: 0px ; " src="viewImage?deploymentId=<s:property value='#deploymentId'/>&imageName=<s:property value='#imageName'/>"><!-- 2. Desenhe DIV dinamicamente de acordo com as coordenadas da atividade atual --><div style="position: absoluto;border:1px solid red;top:<s: valor da propriedade ='#acs.y'/>px;esquerda: <s:property value='#acs.x'/>px;largura: <s:property value='#acs.width'/>px;height:<s:property value='#acs.height'/>px "></div></body>;