JUGDAY 2008 - Porto Alegre dia 31/05

Vou estar por lá, se você mora em Porto Alegre ou arredores, é uma grande oportunidade de estar participando deste evento da comunidade Java gaúcha.

Vão estar pessoas feras como:

  • Paulo Silveira (Caelum)
  • Daniel Wildt (Dell)
  • Eduardo Sasso
  • O JME-Man: Marlon Luz
  • Vitório Sassi
  • Fábio Patrício
  • Dalton Camargo

Tomara que não esteja frio, visto que me recuperei a pouco de uma gripe forte destas paulistanas que são bem cascas-grossas para se curar.
E

Combinando jBPM com REST … Mais que possível, é até simples

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.

processoLic

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

  1. /licencia/{placa}/{ano} - Para iniciar um processo e recebimento de guia de pagamento
  2. /realize/pagementosefa/{id da guia de pagamento} - Para movimentar o “Grafo” do Processo pra frente
  3. 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