O Evento OpenTDC foi de fato muito bom, palestras lotadas e super informativas, parabens a equipe organizadora. Na foto Bruno Rossetto Machado(JBoss Consultant), Edgar, David Barzilay(Gerente de Marketing da Red Hat BR)

Olá amigos, este sábado ocorrerá a versão gratuita do TDC(The Developers Conference), que é o OpenTDC, as inscrições são no “vasco”, pela grade, há algumas palestras que vale a pena você estar presente, além é claro de poder conhecer, encontrar pessoas, trocar idéias e tudo mais.

O site do evento é:  http://www.thedevelopersconference.com.br/opentdc.html

O site para inscrições é: http://www.thedevelopersconference.com.br/inscricoes.seam

O JBoss Seam está presente em grande estilo, não só em algumas aplicações feitas pelo time da GlobalCode, acredito que será bastante falado no evento, vide a grade. Mas o Seam não será o único representante da família JBoss, meu colega Bruno Machado, estará proferindo uma palestra sobre Administração de JBoss, onde vai mostrar dicas de tunning, load-balance, execução de multiplas-instâncias e etc. Há algumas outras palestras também, que não as quero perder por nada.
Eu estarei lá, de bermuda, camiseta e tênis, ajudando o Gerente de Marketing da Red Hat Brasil, David Barzilay, no stand da JBoss dentro do evento. Vejo vocês por lá.

Grande Abraço

Edgar

No meu blog no Java.net, escrevi um pouco sobre algumas visões sobre BPM e algumas notas sobre o nosso jBPM, veja aqui o texto:

Business Processing Modeling – BPM, I was starting my career when I heard the word “Workflow” by the first time, of course I had many other things to learn, instead to pay attention on some thing that seems to be too complicated, however in during any computer science or related course we learn some about “State Machines”, well, I wanna tell you a history that I heard when I worked for one of the biggest federal bank in Brazil: Workflow products had arrived down here in end of 90’s, this bank tried implement a Workflow, although instead to map the the activities into a “State Machine Diagram” where would be possible figure out where the process’s drawbacks or too long waits came from, they mixed business logic to process logic, obtaining serious performance problems and not too accurate information, the word “workflow” was abolished for a long time on this bank after this first frustrated try. Maybe, such things like that happened in all over the world, that’s why during too much time, the concept to try get the company’s process and map all of them represented using cool colored diagrams, which internally are not much more than a “State Machine”. The workflow products getting started so to hibernate, and then as a “pheonix” are relaunched but now with a new name: BPM (Business Process Modeling)! Maybe now, many people will stop to read this entry, but sorry, I can’t figure out BPM in any other way, but now it is dressed much better, with new terminologies and concepts that make it “hot” or “fashion”.

All the text above is just to call your attention for BPM Opensource implementations as an alternative for commercial licensing vendors,as such alternatives I can recommend you the following: OSWorkflow, IntalioBPM and jBPM, actually I respect all of them, but I’ve been using jBPM most frequently, that’s why I will point some about it here. But, I recommend you take a look about the other ones. From this point of this entry, I don’t wanna promote any project marketing, in despite of the fact I wanna tell you my particular vision about jBPM as a solution, and based on my professional experience show you where and how you may apply it into your projects.

The best way I found to look at jBPM, is that it is a great BPM Engine, and it is not a weakness, I mean: When you think about BPM you can take many scenarios, since from modeling, management, governance and so on. JBPM is a really cool BPM framework and Engine. When you have an Application that has an internal workflow with a complete User Interface or a set of Services to do everything you want without. In other words, imagine you have a HelpDesk System built 10 years ago with OracleForms , and you have mapped a kind of workflow on that, however you never figured out how measure your business activity monitoring(BAM). Now, keep in mind that you can during your regular activities in your system call a procedure to generate a simples text file with some information, which can be used to fill information into a process execution of a jBPM process instance, and from another system you can handle such information to get some report or any other issue. If we are speaking about text file generating, it could be a serious candidate for an ESB listener to process it, well but ESB is out of this scope, but keep ESBs usage in mind.

In general, jBPM can be your best option when you want embed a BPM engine into your application, good scenarios contributes for that, such as: JBPM has a native extensible and open language called jPDL, that can process both HumanTasks in addition to invoke WebServices via Java components, it counts with BPEL support as well. In a near future, jBPM will have a PVM(Process Virtual Machine), which basically is “State Machine Framework”, which will render a process independent from the language source, support for BPEL, XPDL using PVM are in the plans of jBPM new versions. A really nice Eclipe plugin where is possible design all process visually, in addition to this, you can use Java components to interact with Node events(node-enter, node-leave for example) or during a transition from a node to another, and everything associating Java objetcs to some specific event during the process execution. The last good reason to use jBPM is the Seam intergration, which make the process management really easy for any developer.

For sure, that you may use jBPM as a “BPM Suite” as well, but keep in mind that you will keep Business Analyst designing the process in UML or in some BPMN tool, and you will need a tech-guy to transform this design in to a jpdl diagram, where a Eclipse plugin is available.

By the way, when you made an option by use an Opensource engine such as jBPM, you can do that because your plan can be get culture about BPM first, and it is really important for a SOA strategy. No matter if you have many boxes with SOA solutions with you have no idea how use them, and even worst when you already paid for them.

Well, if you need more information, you can go to jBPM web site, and download the lastest jbpm-jpdl-suite, which contains the framework and the eclipse plugin all together. Watch the demos, and take a look into documentation.

Se você utiliza o drools e seu plugin para Eclipse, pode ter visto que na mais nova versão, para que você consiga usar DSLs, é preciso renomear o arquivo de regras para .dslr, desta forma você consegue atribuir um “expander” e trabalhar com sua linguagem natural. Como no exemplo:

package com.sample

expander pt_BR.dsl

import com.sample.DroolsTest.Message;
import com.sample.ChamadaTelefonica;
import com.sample.Tarifador;

rule “chamada local”
when
quando a chamada eh local
then
o valor do minuto eh 2.00
end

rule “chamada longa distancia”
when
quando a chamada eh longa distancia
then
o valor do minuto eh 4.00
end

O código acima processa um exemplo de um objeto que seria uma “Chamada Telefonica”, você pode estar se perguntando onde estão os comandos reais, a resposta é que está no pt_BR.dsl, veja o exemplo abaixo:

[condition][]quando a chamada eh local=c : ChamadaTelefonica( local==destino)
[condition][]quando a chamada eh longa distancia=c : ChamadaTelefonica( local!=destino)
[consequence][]o valor do minuto eh {valor}=c.setValor( Tarifador.minutesBetween(c.getInicio(), c.getFim())*{valor});

Por último, ao carregar meu arquivo de regras, eu também associo meu arquivos de DSL ao de regras:

Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( “/Sample.dslr” ) );

Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( “/pt_BR.dsl” ) );

PackageBuilder builder = new PackageBuilder();

builder.addPackageFromDrl( source,dsl );

Pronto, agora podemos ter a liberdade de lidar com as regras da forma que bem entendermos. Maiores informações sobre o projeto Drools: http://www.jboss.org/drools. Claro, que deixo aqui o agradecimento ao meu amigo Tirelli (core-developer do drools), que sempre me tirar as dúvidas necessárias para montar nossos projetos.

E

No jBPM, uma das features mais interessantes é a capacidade de processamento de Tarefas Humanas(HumanTasks), que por sua vez podem guardar várias sub-tarefas de cada usuário em cada fase(node) do workflow.

Quando você cria uma tarefa dentro de um task-node, como por exemplo: [Veja Link]

Para controlar todo a associação de usuário, estabelecemos uma classe para tratar o "assign" da tarefa. Esta classe é UserTaskAssignment, que implementa a interface AssignmentHandler. Nesta classe, como as TaskNodes serão disparadas após o início do processo, no nó de Início(start), logo que o processo passar por ele, armazenaremos uma variável de contexto, no caso um id de usuário. E para cada task, capturamos este id e associamos a(s) tarefa(s), veja o handler:
JAVA:
  1. public class UserTasksAssignment implements AssignmentHandler {private static final long serialVersionUID = -930174228262828841L;
  2.  
  3. public void assign(Assignable assignable, ExecutionContext executionContext)
  4. throws Exception {
  5.  
  6. assignable.setActorId((String) executionContext.getVariable("rg"));
  7.  
  8. }
  9.  
  10. }

Agora, fiz uma adaptação em um dos métodos do meu serviço para mostrar para o usuário X, quantas tarefas e em quais instâncias de processos eles tem tarefas pendentes:

JAVA:
  1. @SuppressWarnings("unchecked")
  2. @GET
  3. @Path("/realize/pagementosefa/{id}/{rg}")
  4. @ProduceMime("text/plain")
  5. public String doPagamentoSefa(@PathParam("id")String id,
  6. @PathParam("rg")String rg) {
  7.  
  8. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  9. try {
  10. GraphSession graphSession = ctx.getGraphSession();
  11. ProcessInstance processInstance = graphSession
  12. .loadProcessInstance(new Long(id));
  13.  
  14. Collection taskList = null;
  15. processInstance.getTaskMgmtInstance().getTaskInstances();
  16.  
  17. taskList = (Collection) ctx.getTaskList(rg);
  18.  
  19. processInstance.getContextInstance().setVariable
  20. ("idsefa"System.currentTimeMillis()+1L );
  21.  
  22. StringBuilder b = new StringBuilder();
  23.  
  24. for (TaskInstance taskInstance : taskList) {
  25.  
  26. b.append(String.format(
  27. "User %s, the Task:: %s is waiting for your start. This is a task from the Process Id:%s\n",              taskInstance.getActorId(),
  28. taskInstance.getName(),
  29. taskInstance.getProcessInstance().getId()));
  30.  
  31. }
  32.  
  33. b.append("Payment Id: " + processInstance.getContextInstance().getVariable("idsefa").toString());
  34.  
  35. return b.toString()  ;
  36.  
  37. } finally {
  38. ctx.close();
  39. }
  40.  
  41. }

O resultado final de retorno para testes de Dubug seria, para o comando REST: http://localhost:8080/licenciamento/realize/pagementosefa/55/1111

User 1111, the Task:: entregar recibo is waiting for your start. This is a task from the Process Id: 55
User 1111, the Task:: pagar is waiting for your start. This is a task from the Process Id: 55
Payment Id: 1213310025945

Este post pode estar demorado, mas nunca é tarde demais para se falar, o JBoss Operations Network, ou o JON, é a ferramenta em browser web que permite controle, administração, monitoração do ambiente e geração de alertas sobre eventos que podem ocorrer no seu parque de máquinas, onde hajam um ou vários servidores com JBoss Application Server instalados.

O JON, é acessível somente para clientes que possuem suporte oficial da Red Hat, em outras palavras, só as versões Enterprise de JBoss AS são homologadas para o JON, bem como só estes clientes podem adquirir a subscrição(licença de suporte) para este produto.

Num passado, esta ferramenta utilizava em sua estrutura do kernel da Hyperic, por este motivo não era "Opensource"! Como assim não era? Agora é? A resposta é: Sim, agora o código base para o JON é opensource, resultado da união de esforços entre Red Hat e Hyperic, criando assim o projeto RHQ-Project.

Com o projeto RHQ, lançamos recentemente o Jon 2.0 GA, que é a mais nova versão do JON, entre as inúmeras melhorias e novidades, destaco a capacidade de cricação de extensões(plugins), que permitem os clientes criarem suas próprias formas de monitoração, desde algum requisito de hardware, infra ou até mesmo de aplicações, por exemplo: "Quantas vendas foram realizadas no último dia?", podendo gerar um alerta, caso o número tenha sido menor que 20% ao baseline estabelecido.

Claro, o foco do JON é monitorar as questões de sistemas operacionais(solaris, win e linux a exemplo), JBoss AS e seus recursos (filas JMS, EJBs, DataSources/Pools de Conexão,Sessões Hibernate), além de Tomcat, Apache e até o MS IIS.

De fato, o JON torna a plataforma JBoss AS, mais que uma plataforma estável e performática, mas também agora, como uma cara corporativa.

Sites

E claro, parabens Sport do Recife, pela Copa do Brasil!!!!! :D
JON

Em um dos clientes que eu estamos atendendo na empresa, um dos requisitos é autenticar no RACF, uma espécie de LDAP para o Mainframe. Nosso cliente, disponibilizou um WS que faz este trabalho "sujo". Nos resta então criar um LoginModule que suporte esta nova funcionalidade.

Quando você proteger Aplicações em Java é importante saber onde você pode se conectar, o JBoss oferece por padrão alguns LoginModules, entre eles:

-LoginModule baseado em arquivos properties
-LoginModule baseado em Banco de Dados
-LoginModule para LDAP

Em nossa solução, estaremos promovendo mais um LoginModule. O primeiro passo é alterar o login-config.xml dentro de /default/conf, no caso adicionamos mais um LoginModule, como a seguir:
Screenshot-*login-config.xml (-opt-java-jboss-as-jboss-4.2.2.GA-server-dev-conf) - gedit.png

Adicionamos até uma propriedade, que é o WSDL do Serviço, que pode variar dependendo do caso, e ai a configuração poderá ser feita no LoginModule, sem a necessidade de recompilação.

Estamos dizendo acima que a classe org.jboss.security.auth.api.JBossLoginModuleWS é a implementação deste mecanismo de Login. Veja o código-fonte de exemplo:

JAVA:
  1. <pre>package org.jboss.security.auth.api;
  2. import java.security.acl.Group;
  3. import java.util.Map;
  4. import javax.security.auth.Subject;
  5. import javax.security.auth.Subject;
  6. import javax.security.auth.callback.CallbackHandler;
  7. import javax.security.auth.login.LoginException;
  8. import org.jboss.security.SimpleGroup;
  9. import org.jboss.security.SimplePrincipal;
  10. import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
  11. import org.jboss.security.auth.api.ws.client.*;
  12. import org.jboss.security.auth.ws.AutenticateProxy;
  13. /**
  14. *
  15. * @author Edgar Silva
  16. */
  17. public class JBossLoginModuleWS extends UsernamePasswordLoginModule {
  18. /**
  19. * WSDL address
  20. */
  21. private String wsdl;
  22. protected org.jboss.security.auth.ws.Principal p;
  23. public JBossLoginModuleWS() {
  24. super();
  25. }
  26. @Override
  27. public void initialize(Subject subject, CallbackHandler callbackHandler,
  28. Map sharedState, Map options) {
  29. super.initialize(subject, callbackHandler, sharedState, options);
  30. log.info("WebServices Login Module : initialize");
  31. }
  32. @Override
  33. protected String getUsersPassword() throws LoginException {
  34. return "";
  35. }
  36. @Override
  37. protected boolean validatePassword(String inputPassword, String expectedPassword) {
  38. boolean isValid = false;
  39. if (inputPassword != null) {
  40. try {
  41. log.info("Connecting via WS ..............");
  42. String username = getUsername();
  43. log.info("UserName: " + getUsername());
  44. log.info("Password: "+ inputPassword);
  45. p = new AutenticateProxy().autentica(username, inputPassword);
  46. log.info("Connected as: " + p.getUsuario());
  47. isValid = (p != null);
  48. } catch (Throwable e) {
  49. e.printStackTrace();
  50. super.setValidateError(e);
  51. }
  52. }
  53. return isValid;
  54. }
  55. @Override
  56. protected Group[] getRoleSets() throws LoginException {
  57. SimpleGroup userRoles = new SimpleGroup("Roles");
  58. userRoles.addMember(new SimplePrincipal(p.getGrupo()));
  59. Group[] roleSets = {userRoles};
  60. return roleSets;
  61. }
  62. public String getWsdl() {
  63. return wsdl;
  64. }
  65. public void setWsdl(String wsdl) {
  66. this.wsdl = wsdl;
  67. }
  68. }</pre>

Agora, a qualquer momento que você proteger uma Aplicação Web, ou quiser utilizar o Servidor de Aplicações para fazer isto, você deverá configurar o jboss-web.xml para apontar para o LoginModule que voce configurou no login-config.xml, veja o exemplo a seguir:
jboss-web.xml

Além desta configuração, você deverá proteger as páginas de uma Aplicação Web, por exemplo, sendo assim, você irá configurar o web.xml da sua aplicações para pedir o "Realm"(LoginModule) que vc configurou com o nome WSLoginModule, em nosso caso vamos liberar apenas o acesso as páginas .jsp caso o Login seja efetivado no WebServices de autenticação. Veja o web.xml:

web.xml

Esta é mais uma dica, que sei que posso precisar um dia novamente!

[]s
E

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 den