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]public class UserTasksAssignment implements AssignmentHandler {private static final long serialVersionUID = -930174228262828841L;

public void assign(Assignable assignable, ExecutionContext executionContext)
throws Exception {

assignable.setActorId((String) executionContext.getVariable(”rg”));

}

}
[/java]
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]

@SuppressWarnings(”unchecked”)
@GET
@Path(”/realize/pagementosefa/{id}/{rg}”)
@ProduceMime(”text/plain”)
public String doPagamentoSefa(@PathParam(”id”)String id,
@PathParam(”rg”)String rg) {

JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
try {
GraphSession graphSession = ctx.getGraphSession();
ProcessInstance processInstance = graphSession
.loadProcessInstance(new Long(id));

Collection taskList = null;
processInstance.getTaskMgmtInstance().getTaskInstances();

taskList = (Collection) ctx.getTaskList(rg);

processInstance.getContextInstance().setVariable
(”idsefa”, System.currentTimeMillis()+1L );

StringBuilder b = new StringBuilder();

for (TaskInstance taskInstance : taskList) {

b.append(String.format(
“User %s, the Task:: %s is waiting for your start. This is a task from the Process Id:%s\n”, taskInstance.getActorId(),
taskInstance.getName(),
taskInstance.getProcessInstance().getId()));

}

b.append(”Payment Id: ” + processInstance.getContextInstance().getVariable(”idsefa”).toString());

return b.toString() ;

} finally {
ctx.close();
}

}

[/java]

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