Ao deparar-se com o jBPM a primeira impressão sempre é meio confusa, mas depois que se passa do terceiro processo baseado em BPM e com a idéia de POG, e isto nada quer dizer a famosa "Programação Orientada a Gambiarra" e sim a Programação Orientada a Grafos , sim é isto mesmo: Graphos, ou quem sabe "desenhos", ou "caixinhas" ou o que sua imaginação preferir.
Este pequeno post mostra uma idéia de como você pode combinar a implementação EasyRest e o jBPM ambos membros do guarda-chuva de soluções JBoss, vamos começar com algumas considerações para quem for implementar algo no mundo real:
- No Exemplo, o jbpmContext pode ser melhor aproveitado
- O uso de TaskNodes (nós que suportam interação humanda) poderiam no caso abaixo serem simplesmente nodes do tipo State ou simples Nodes
Processo
O exemplo é simples, apenas trata que quando você quer licenciar um veiculo, você passa por: a) Um pagamento na Secretaria de Fazenda, b) Faz uma Vistoria do seu carro, c) o Detran lhe envia o documento e pronto.

A idéia então é através de algumas URLs, poder te acessibilidade a navegar por n instancias deste processo, e a qualquer momento, saber em que passo seu veículo está, assim como o Detran também contabilizar informações para ele, gerando assim um dado que poderia ser registrado num dashboard de uma solução BAM.
As URLS de Exemplo
- /licencia/{placa}/{ano} - Para iniciar um processo e recebimento de guia de pagamento
- /realize/pagementosefa/{id da guia de pagamento} - Para movimentar o "Grafo" do Processo pra frente
- realize/vistoria/{id da guia de pagto}/{id confirmacao pagamento sefa} - Para movimentar para o nó "envia-documento"
Implementando Estes exemplos
1 - Temos que iniciar a nova instancia de um processo, para isto veja noss método que responde pela URL no nosso pojo de servico REST:
JAVA:
-
-
@Path("/")
-
public class Service {
-
ProcessDefinition processDefinition;
-
@GET
-
@Path("/licencia/{ano}/{placa}")
-
@ProduceMime("text/plain")
-
public String licenciar
(@PathParam
("ano")
-
String ano, @PathParam
("placa")
-
-
-
JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
-
try {
-
ProcessInstance instance = ctx.newProcessInstance("licenciamento");
-
instance.getContextInstance().setVariable("ano", ano);
-
instance.getContextInstance().setVariable("placa", placa);
-
Token t = instance.getRootToken();
-
t.signal();
-
-
ctx.save(instance);
-
-
return new Long(instance.
getId()).
toString();
-
-
} finally {
-
ctx.close();
-
}
-
-
}
Observe que adicionamos algumas variáveis no contexto do jbpm, estas variáveis são armazenadas em memória ou persistidas no Banco de Dados, fazendo com que a qualquer momento você possa recuperá-las.
2 - Agora vamos recuperar uma instância de processo ativa, com base no id repassado na URL Rest.
JAVA:
-
@GET
-
@Path("/realize/pagementosefa/{id}")
-
@ProduceMime("text/plain")
-
public String doPagamentoSefa
(@PathParam
("id")
-
-
JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
-
try {
-
GraphSession graphSession = ctx.getGraphSession();
-
ProcessInstance processInstance = graphSession
-
.
loadProcessInstance(new Long(id
));
-
-
taskList =
(Collection) processInstance.
getTaskMgmtInstance().
getTaskInstances();
-
((TaskInstance)taskList.iterator().next()).end();
-
processInstance.
getContextInstance().
setVariable("idsefa",
System.
currentTimeMillis()+1L
);
-
return processInstance.getContextInstance().getVariable("idsefa").toString() ;
-
} finally {
-
ctx.close();
-
}
-
}
3 - Continuando o Processo promovendo a navegação:
JAVA:
-
@GET
-
@Path("/realize/vistoria/{id}/{idsefa}")
-
@ProduceMime("text/plain")
-
public String doVistoria
(@PathParam
("id")
-
-
-
JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
-
try {
-
GraphSession graphSession = ctx.getGraphSession();
-
ProcessInstance processInstance = graphSession
-
.
loadProcessInstance(new Long(id
));
-
if (processInstance.getContextInstance().getVariable("idsefa")==null) {
-
return "POR FAVOR FACA A PAGAMENTO NA SEFA";
-
}
-
-
taskList =
(Collection) processInstance.
getTaskMgmtInstance().
getTaskInstances();
-
taskList.iterator().next();
-
((TaskInstance)taskList.iterator().next()).end();
-
processInstance.
getContextInstance().
setVariable("idvistoria",
System.
currentTimeMillis()+1L
);
-
return processInstance.getContextInstance().getVariable("idvistoria").toString() ;
-
-
} finally {
-
ctx.close();
-
}
-
}
Considerações
O modelo de desenvolvimento desta solução muito mais que simples, torna-se divertido, claro que esta aplicação é uma demo, que é uma das coisas que vamos mostrar no JUGDAY dia 31 em Porto Alegre as 16:00, na palestra OpenSource SOA com JBoss . Vejo vocês por lá então "tché".
[]s
E