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]
@Provider
@Path(”/”)
public class Service {
ProcessDefinition processDefinition;
@GET
@Path(”/licencia/{ano}/{placa}”)
@ProduceMime(”text/plain”)
public String licenciar(@PathParam(”ano”)
String ano, @PathParam(”placa”)
String 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();
}
}
[/java]
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”)
String id) {
JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
try {
GraphSession graphSession = ctx.getGraphSession();
ProcessInstance processInstance = graphSession
.loadProcessInstance(new Long(id));
Collection taskList = null;
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();
}
}
[/java]
3 - Continuando o Processo promovendo a navegação:
[java]
@GET
@Path(”/realize/vistoria/{id}/{idsefa}”)
@ProduceMime(”text/plain”)
public String doVistoria(@PathParam(”id”)
String id, @PathParam(”idsefa”) String idSefa) {
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”;
}
Collection taskList = null;
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();
}
}
[/java]
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