Archive for May, 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

Vivo, enérgico, eletrizante, informativo e legal são os adjetivos que resumem a minha visão do Falando em Java 2008 , que mostrou muito mais que uma empresa, mas a força que a comunidade e colaboração podem gerar, a reunião de várias pessoas num domingo meio frio da capital de SP. Muito mais que um evento de Java, mas também a consolidação de uma presença marcante da Caelum em termos de tecnologias conterporâneas em nosso país, ao passo que conversei com pessoas de Natal, Recife, São José dos Campos, Brasilia, Goiania etc...

Particularmente, encontrei dois grandes amigos da Borland, Edmilson Miyasaki e Alexandre Magno, que estão a frente da vertical de Agile/Scrum da Caelum, de fato é uma equipe que merece todo o prestigio e respeito. Eles estão na foto deste post, e eu com uma cara no mínimo estranha. (rs)
A presença do Emmanuel Bernard foi um dos pontos altos do evento, um inglês fácil para todos entenderem, mostrou um pouco do porquê JBoss ainda continua sendo uma das maiores fomentadoras de alta tecnologia em Java nos dias de hoje.

Bom ter estado com todos, e espero poder ir no FEJ 2009 !

E

HommerCorra, corra, você tem que saber isto, do contrário você pode ser chamado de burro, ou as pessoas podem não lhe achar tão inteligente, corra, eles estão chegando, vá logo rapaz, já não basta você não ter acreditado em Ruby, e ter escrito uma aplicação em RubyOnRails, vamos, não há tempo a perder, você precisa ser "fashion" e logo...logo isso vai surgir no café da empresa, e se você fizer cara de pânico ao receber a pergunta "Daí fulano, você tem usado Scala?".

Piadas a parte, tenho visto várias movimentações sobre esta nova linguagem, talvez a minha área de atuação me leve a não ter muito interesse nessas milhões de coisas que surgem todos os dias, mas já vi alguns posts de pessoas dignas de respeito sobre esta linguagem. Vou esperar uma oportunidade de fazer algo útil com ela, enquanto isso, eu ainda consigo sobreviver sabendo apenas Java :)
Documentações: http://www.scala-lang.org

Em ambientes de integração, onde falamos de milhares de transações por dia ou por hora, minuto etc, é muito importante atentar para as atividades que acontecem e com isto tomamos alguma ação, para isto damos o nome de "evento".

CEP vem de (Complex Event Processing) e ESP (Event Stream Processing), ok, siglas bonitas, para quando preciso usar CEP?

  • Imagine processar milhões de verificações por dados de objetos e com base nissso tomar algumas decisões, seja para monitoração ou gerar eventos que executem outras atividades.
  • CEP e ESP estão focados em processamento de grandes volumes.
  • É fácil confundir CEP com RulesEngines, mas uma coisa é o Pattern Matcher e outra coisa é o processamento de grandes volumes de informações de objetos, ainda que numa janela de tempo, onde alguns Garbage Collectors tenham sido executados.
  • Como os produtos de CEP têm implementações de Pattern Matching não tão poderosas, a idéia é juntar o poder de do Drools (Engine Rules) e CEP.

Vamos imaginar um cenário de atividades de transito, como um evento : "O veículo mudou de jurisdição", quais os fatores estão envolvidos?

  1. Exemplo, meu carro é licenciado no Detran-Rio Grande do Sul (claro que este processo é apenas de exemplo)
  1. O Detran-SP envia todas as multas aplicadas no estado de SP para um broker do Denatran (por exemplo um ESB ou um SCA)
  2. O Denatram envia num mês milhões de transações enviando todas as multas para as jurisdições regionais
  3. O Detran-RS recebe um grande lote de notificações
  4. Dessas notificações que foram processadas, por hipótese (claro :) ), há várias infrações do meu veículo num periodo de 2 anos.
  5. Podemos chegar a conclusão que este veículo pode ter mudado de jurisdição e uma notificação via e-mail poderia ser enviado para o proprietário.

A grande questão acima, não é a apenas a regra, mas o volume de transações, sendo assim, o uso de CEP aliado a um ESB, é algo que particularmente me chama a atenção, um barramento de serviços aliado a algo além de um simples BAM.

O Drools em suas próximas versões estará suportando CEP, nosso amigo brasileiro Edson Tirelli entre as muitas coisas, está trabalhando exatamente nestes aspectos no momento, tive acesso a um trunk que já contempla algumas coisas relacionadas a CEP já no Drools.

Se você tiver um maior interesse, recomendo utilizar a mesma implementação que tenho usado para estudo, que é o Esper, que inclusive tem uma versão a Java, e uma .net.

Bons estudos

E

Falamos outro dia sobre REST aqui neste blog, estudei a implementação de referência do JAX-RS Jersey, funciona super bem, baixei os fontes, é de fato simples utilizá-la dentro do NetBeans, tive alguns problemas de classloader dentro do JBoss, mas nada que adaptar a forma de carregamento e procura dos resources do Jersey, não fizessem funcionar. Para estudos e quem sabe até algumas coisas em produção o recomendaria.

Edgar e Bill Burke numa festa do hotel W no JavaOne2007

Há um cara na JBoss que respeito muito que é o Bill Burke, e não por ele ter pagado várias Guiness para mim e outros amigos no JavaOne 2007, mas principalmente porque o cara é de fato um cara que onde ele se mete, as coisas acabam saindo do outro lado, sendo assim, mesmo com o jeitão dele meio "polemico" as vezes, lançou o projeto RestEasy, que é a implementação REST da JBoss.Pequeno Exemplo com EasyRest

O EasyRest suporta tanto os mecanimos de publicação, como os de clientes, e até mesmo os conceitos de Comet do Grizzlly, abaixo um pequeno exemplo :

JAVA:
  1. package rest;
  2.  
  3. import javax.ws.rs.GET;
  4. import javax.ws.rs.Path;
  5. import javax.ws.rs.ProduceMime;
  6. import javax.ws.rs.ext.Provider;
  7.  
  8. @Path("service")
  9. @ProduceMime("text/plain")
  10. public class Subscritption {
  11.  
  12. @GET
  13. public String status() {
  14.  
  15. return "JBoss REST Works!";
  16. }
  17.  
  18. }

Para acessar este seviço, basta digitar no browser o endereco:

http://localhost:8080/jboss-rest/service

Um outro exemplo seria por exemplo uma pesquisa de Voos para o dia de hoje para uma agencia de turismo:

JAVA:
  1. @ProduceMime("text/plain")
  2. @Path("/trip")
  3. public class TripService {
  4.  
  5. @GET
  6. @Path("/flight/today/{from}/{to}")
  7. public String getFlightsFromToday
  8. (@PathParam("from")String from,
  9. @PathParam("to")String to){
  10. //here you can perform your search and ruturn simple plain text as the return
  11. //but if you want, you can change to XML
  12.  
  13. return String.format
  14. ("Performing searching from %s to %s",
  15. from,
  16. to);
  17. }
  18. }

A url para chamar este serviço seria:

http://localhost:8080/restsample/trip/flight/today/gru/bel

Claro, este pode não ser dos melhores tutoriais, em breve algumas coisas mais interessantes por aqui.

[]s

E