Pages

Recentemente, após um amigo avisar que a versão final do framework VRaptor4 estava disponível, resolvi atualizar o projeto que acabávamos de começar e que utilizava a versão anterior desse framework. Após alguns dias sofrendo com a migração para a nova versão, finalmente, tudo estava funcionando e continuamos o desenvolvimento.

A nova versão do VRaptor trouxe mudanças significativas, a principal delas foi a utilização do CDI 1.1 como container de DI (Dependency Injection).  Como estávamos utilizando o Tomcat 8 tivemos que habilitar o suporte ao CDI utilizando o Weld. Logo vimos que o tempo de inicialização do servidor estava muito demorado, cerca de 30 segundos, e a cada modificação realizada um restart do servidor acontecia e lá se iam mais 30 segundos. Ao final do dia, o tempo perdido com o redeploy da aplicação era bastante considerável, gastávamos cerca de 1/5 do dia só esperando as modificações realizadas surtirem efeito.

Não conformado, resolvi buscar uma forma de diminuir o tempo perdido, foi então que lembrei de uma conversa que tive a cerca de um ano atrás com outro amigo. Nela ele havia me falado de uma JVM que realizava um hotswapping mais eficiente do que o disponibilizado na versão padrão, tratava-se do JRebel, entretanto, ao verificar o valor da licença, descartei de imediato essa possibilidade. Então, o jeito foi procurar alguma solução open source que realizasse a mesma função.

Não demorou muito até que encontrei o projeto DynamicCode Evolution VM, que segundo a descrição do produto “possibilita um número ilimitado de redefinições de classes em tempo de execução”. Resolvi então fazer o download do binário e testar.

Logo de cara tive problemas de compatibilidade. A versão disponibilizada no site oficial estava desatualizada. Mais algumas buscas no Google até que encontrei um fork do projeto original no Github, fiz o download dos novos binários e dessa vez tudo funcionou corretamente. O processo de instalação é bem simples e não existem configurações a serem realizadas. Os testes realizados mostraram que o hotswapping realmente funciona, possibilitando um enorme ganho de produtividade para toda a equipe.

Para quem tiver interesse em utilizar a DCEVM, segue um passo a passo para um ambiente de desenvolvimento utilizando o Eclipse Luna, JDK 8 e Tomcat 8.

1. Faça o download do binário correspondente ao seu sistema operacional em https://dcevm.github.io/ , no meu caso a versão baixada foi Light Java 8 update 5, build 52. 
2. Abra o terminal e digite:

java -jar installer.jar

Caso esteja usando o Windows com o JDK instalado no diretório padrão você deverá inciar o cmd com privilégios de administrador, pra isso clique com o botão direito no ícone e selecione Executar como Administrador.

3. A seguinte tela irá aparecer:



Nela você poderá visualizar todas as instalações encontradas, podendo ainda adicionar uma nova instalação através do botão Add instalation directory, caso a versão desejada não tenha aparecido na listagem.

Para instalação tudo que você deve fazer é selecionar a instalação desejada e clicar em Replace by DCEVM. No meu caso, realizei a substituição do jdk1.8.0_05. Após a substituição a listagem deverá conter as seguintes informações:


Agora vamos configurar o Eclipse para utilizar a versão da DCEVM.

1. Abra o Eclipse e vá em Windows > Preferences > Java > Installed JREs
2. Caso a versão na qual foi realizada a substituição não esteja nesta listagem clique em Add.., escolha a opção Standard VM e informe a localização da instalação.
3. Marque-a como padrão (Figura abaixo).



4. O próximo passo é configurar o servidor Tomcat, para isso vá em Windows > Server > Runtime Environments.


5. Caso a versão desejada não esteja na lista clique em Add.., selecione a versão desejada (no meu caso foi a Apache Tomcat v8.0) e informe o diretório de instalação do tomcat.
6. Logo abaixo selecione a JRE escolhida no passo 2. Clique em finalizar.


7. Na view Servers, clique com o botão direito e vá em New > Server e adicione o servidor configurado no passo anterior.
8. Logo após, dê um clique duplo no servidor adicionado no passo anterior e na aba Publishing deixe marcada a opção Automatically publish when resourcess change.


9. Na parte inferior, clique em Modules e para cada um dos módulos existentes clique em Edit... e desmarque a opção Auto reloading enabled.


Pronto!





Estudo de Caso: Aplicação de Regras de Produção para gerenciamento de status processuais


Contexto do problema 

O Poder Judiciário vem ao longo do tempo tentando aperfeiçoar os sistemas informatizados de controle processual. Grande parte dos esforços está concentrada no aperfeiçoamento de duas das principais funcionalidades desses sistemas: A distribuição e a movimentação processual. A distribuição marca o início da vida de um processo e as movimentações que vão sendo realizadas representam a evolução do mesmo.

O ciclo de vida ou tramitação de um processo pode ser representado conforme o esquema abaixo:


Figura 1 Fluxo de tramitação


Cada retângulo acima representa um status que o processo pode assumir em um dado momento durante a sua tramitação. A mudança de um status para outro é determinada pelas movimentações que vão sendo realizadas, sendo que essas movimentações sempre devem obedecer a uma sequência lógica existente para evitar estados inconsistentes, por exemplo, arquivar um processo que ainda não foi baixado. 

Atualmente, a validação dessa sequencia lógica é realizada através de estruturas condicionais aninhadas, Figura 2.


Figura 2 Validação com estruturas condicionais


Existem alguns casos em que a movimentação só altera o status se o processo for de determinadas classe processual, por exemplo, a movimentação Incompetência só altera o status se o processo for do tipo Procedimento Ordinário. Para cobrir essas exceções uma nova entidade, que faz o relacionamento de um tipo de processo, uma movimentação e um status, foi criada.

Essa abordagem funciona corretamente, porém existe uma dificuldade muito grande no processo de avaliação dessas regras por parte dos especialistas (magistrados), devido ao fato das mesmas estarem hardcoded. Até mesmo os próprios programadores enfrentam dificuldades para entender e sentir confiança na alteração de uma dessas regras, tendo em vista o impacto que elas causam nos processos.

Partindo desse problema surgiu a ideia de utilizar regras de produção juntamente com uma linguagem específica de domínio (DSL) para implementar essas funcionalidades e ao mesmo tempo permitir a apreciação dessas regras por um especialista de forma mais fácil e natural.

Implementação

Para a representação e raciocínio do conhecimento especializado foi utilizado o framework JBoss Drools.

A primeira decisão a ser tomada foi sobre a utilização de Stateless ou Statefull Session. A diferença básica entre elas é que em uma sessão Statefull a modificação dos dados são informados ao motor de conhecimento para que um novo raciocínio possa ser realizado, esse processo recebe o nome de inferência. Já no outro caso isso não ocorre. Para esse trabalho foi utilizada uma Stateless Session, pois o mecanismo de inferência não se faz necessário.

O passo seguinte foi criação das regras, onde ficou clara a necessidade da elaboração de dois conjuntos distintos de regras: uma para a validação da movimentação (verificar se determinada movimentação pode ou não ser realizada), Figura 3, e outra para a alteração efetiva dos status, Figura 4.

A imagem abaixo apresenta algumas das regras criadas:

Figura 3 Validação da movimentação


Figura 4 Alteração do status

Uma pequena aplicação foi desenvolvida com o objetivo de testar as regras criadas e avaliar a aplicação dessa abordagem. O funcionamento é bem simples, basta informar o número do processo e a movimentação que deseja realizar. Primeiramente esses dados são submetidos às regras de validação, que decidirão se o procedimento poderá continuar a ser realizado ou não e nesse último caso ainda informará o motivo. Caso a movimentação possa prosseguir os dados passarão pelo segundo conjunto de regras, que pode atribuir ao processo o seu novo status.

Os resultados mostraram um correto funcionamento da aplicação de regras de produção no contexto apresentado e a resolução do problema inicial levantando (avaliação das regras por parte dos especialistas), obtendo uma boa aceitação pelos mesmos.