Archive for May 26th, 2008

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

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:
  1. @Path("/")
  2. public class Service {
  3. ProcessDefinition processDefinition;
  4. @GET
  5. @Path("/licencia/{ano}/{placa}")
  6. @ProduceMime("text/plain")
  7. public String licenciar(@PathParam("ano")
  8. String ano, @PathParam("placa")
  9. String placa) {
  10.  
  11. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  12. try {
  13. ProcessInstance instance = ctx.newProcessInstance("licenciamento");
  14. instance.getContextInstance().setVariable("ano", ano);
  15. instance.getContextInstance().setVariable("placa", placa);
  16. Token t = instance.getRootToken();
  17. t.signal();
  18.  
  19. ctx.save(instance);
  20.  
  21. return new Long(instance.getId()).toString();
  22.  
  23. } finally {
  24. ctx.close();
  25. }
  26.  
  27. }

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:
  1. @GET
  2. @Path("/realize/pagementosefa/{id}")
  3. @ProduceMime("text/plain")
  4. public String doPagamentoSefa(@PathParam("id")
  5. String id) {
  6. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  7. try {
  8. GraphSession graphSession = ctx.getGraphSession();
  9. ProcessInstance processInstance = graphSession
  10. .loadProcessInstance(new Long(id));
  11. Collection taskList = null;
  12. taskList = (Collection) processInstance.getTaskMgmtInstance().getTaskInstances();
  13. ((TaskInstance)taskList.iterator().next()).end();
  14. processInstance.getContextInstance().setVariable("idsefa"System.currentTimeMillis()+1L );
  15. return processInstance.getContextInstance().getVariable("idsefa").toString() ;
  16. } finally {
  17. ctx.close();
  18. }
  19. }

3 - Continuando o Processo promovendo a navegação:

JAVA:
  1. @GET
  2. @Path("/realize/vistoria/{id}/{idsefa}")
  3. @ProduceMime("text/plain")
  4. public String doVistoria(@PathParam("id")
  5. String id, @PathParam("idsefa") String idSefa) {
  6.  
  7. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  8. try {
  9. GraphSession graphSession = ctx.getGraphSession();
  10. ProcessInstance processInstance = graphSession
  11. .loadProcessInstance(new Long(id));
  12. if (processInstance.getContextInstance().getVariable("idsefa")==null) {
  13. return "POR FAVOR FACA A PAGAMENTO NA SEFA";
  14. }
  15. Collection taskList = null;
  16. taskList = (Collection) processInstance.getTaskMgmtInstance().getTaskInstances();
  17. taskList.iterator().next();
  18. ((TaskInstance)taskList.iterator().next()).end();
  19. processInstance.getContextInstance().setVariable("idvistoria"System.currentTimeMillis()+1L );
  20. return processInstance.getContextInstance().getVariable("idvistoria").toString() ;
  21.  
  22. } finally {
  23. ctx.close();
  24. }
  25. }

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