Pular para o conteúdo principal

Regras de Produção com JBoss Drools


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.

Comentários

Postagens mais visitadas deste blog

Hot swapping no Eclipse usando DECVM

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 di...

Quebrar o quê?

Por: Rafael Viana --> Minha mãe realiza trabalhos de artesanato e sempre eu ou meu pai fotografamos tais trabalhos para servir de referência para futuros clientes ou até mesmo para ela. Tento organizar as fotos por temas, como por exemplo lembrancinhas de aniversário, peças de anatomia, pois ela mesma diz “eu não entendo nada dessas coisas de computador”. Ontem aconteceu algo que chamou minha atenção e me deixou bastante intrigado. Narrarei o fato nos próximos parágrafos e irei mostrar algumas conclusões interessantes sobre o ocorrido. Eu e minha mãe, realizávamos um levantamento de todas as fotos e ela me acusou de desorganizar as fotos e que eu também tinha sumido com algumas fotos que haviam sido tiradas recentemente. Esse levantamento me fez sugerir que ela mesma catalogasse as fotos ou que ela pelo menos participasse de tal catalogação. Também sugeri que ela colocasse tais fotos na internet, coisa que só é feita por mim, pois como ela mesma diz “eu não entendo nada des...