No jBPM, uma das features mais interessantes é a capacidade de processamento de Tarefas Humanas(HumanTasks), que por sua vez podem guardar várias sub-tarefas de cada usuário em cada fase(node) do workflow.

Quando você cria uma tarefa dentro de um task-node, como por exemplo: [Veja Link]

Para controlar todo a associação de usuário, estabelecemos uma classe para tratar o "assign" da tarefa. Esta classe é UserTaskAssignment, que implementa a interface AssignmentHandler. Nesta classe, como as TaskNodes serão disparadas após o início do processo, no nó de Início(start), logo que o processo passar por ele, armazenaremos uma variável de contexto, no caso um id de usuário. E para cada task, capturamos este id e associamos a(s) tarefa(s), veja o handler:
JAVA:
  1. public class UserTasksAssignment implements AssignmentHandler {private static final long serialVersionUID = -930174228262828841L;
  2.  
  3. public void assign(Assignable assignable, ExecutionContext executionContext)
  4. throws Exception {
  5.  
  6. assignable.setActorId((String) executionContext.getVariable("rg"));
  7.  
  8. }
  9.  
  10. }

Agora, fiz uma adaptação em um dos métodos do meu serviço para mostrar para o usuário X, quantas tarefas e em quais instâncias de processos eles tem tarefas pendentes:

JAVA:
  1. @SuppressWarnings("unchecked")
  2. @GET
  3. @Path("/realize/pagementosefa/{id}/{rg}")
  4. @ProduceMime("text/plain")
  5. public String doPagamentoSefa(@PathParam("id")String id,
  6. @PathParam("rg")String rg) {
  7.  
  8. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  9. try {
  10. GraphSession graphSession = ctx.getGraphSession();
  11. ProcessInstance processInstance = graphSession
  12. .loadProcessInstance(new Long(id));
  13.  
  14. Collection taskList = null;
  15. processInstance.getTaskMgmtInstance().getTaskInstances();
  16.  
  17. taskList = (Collection) ctx.getTaskList(rg);
  18.  
  19. processInstance.getContextInstance().setVariable
  20. ("idsefa"System.currentTimeMillis()+1L );
  21.  
  22. StringBuilder b = new StringBuilder();
  23.  
  24. for (TaskInstance taskInstance : taskList) {
  25.  
  26. b.append(String.format(
  27. "User %s, the Task:: %s is waiting for your start. This is a task from the Process Id:%s\n",              taskInstance.getActorId(),
  28. taskInstance.getName(),
  29. taskInstance.getProcessInstance().getId()));
  30.  
  31. }
  32.  
  33. b.append("Payment Id: " + processInstance.getContextInstance().getVariable("idsefa").toString());
  34.  
  35. return b.toString()  ;
  36.  
  37. } finally {
  38. ctx.close();
  39. }
  40.  
  41. }

O resultado final de retorno para testes de Dubug seria, para o comando REST: http://localhost:8080/licenciamento/realize/pagementosefa/55/1111

User 1111, the Task:: entregar recibo is waiting for your start. This is a task from the Process Id: 55
User 1111, the Task:: pagar is waiting for your start. This is a task from the Process Id: 55
Payment Id: 1213310025945

Leave a Reply