jboss drool_ Regras de Negócio Drools Utilizando a plataforma da JBOSS DROOLS como ambiente para gerenciamento de regras de negócio. ção, manutenção e execução. Este artigo mostra como utilizar o JBoss Drools como um Sistema para Gerenciamen- Toda empresa possui uma série de processos de negócio. Estes podem ser considerados como sendo o conjunto de todas as atividades desempenhadas pela empresa. Cada processo de negócio visa keting visa aumentar o interesse dos consumidores pelo produto da empresa. Para chegar a este resul- - de negócio são os requisitos fundamentais para que - destas características, desenvolver regras de negócio usando uma linguagem de programação tradicio- - - / 56
mais de 10 anos de experiência, já trabalhou em empresas de diversos setores como: Telecom, Bancos e Indústria utilizando Java, cimento destas regras, muitas vezes conhecida como - delar completa e corretamente as entidades do do- vez que uma regra de negócio for mudada, o departa- vamente o código da aplicação, passar pelos testes, deploys nos servidores etc., ou seja, todo o trabalho - uso de um Sistema de Gerenciamento de Regras de monitorados e mantidos separadamente. Esses sis- Language). Desta forma os especialistas de negócio comportamento dos sistemas, reduzindo o tempo e realizadas. Como as regras são mantidas separada- ças efetuadas podem ser aplicadas rapidamente em produção sem a necessidade de recompilar e rede- conjunto de regras pode ser aproveitado sendo em- Diferenças entre Linguagens Imperativas x Linguagens Declarativas radigma de programação imperativa ou procedural) na CPU são gravados na memória. Seus conceitos de memória; atribuição, que representa a escrita de da memória para a CPU, e o resultado da avaliação - - Pascal, Java, C e Python. - - - deduzidos a partir de outros. Fatos conhecidos a respeito de um determinado problema devem ser reunidos; regras devem ser criadas para que seja possível - Uma linguagem declarativa utiliza uma ou mais - - Uma instrução em uma linguagem imperativa - Uma instrução em uma linguagem declarativa seria algo como: se estiver chovendo, então você precisa de um guarda-chuva. Neste caso eu tenho a guarda-chuva. Drools - qual provê uma plataforma integrada para o geren- Eventos. Esta plataforma possui cinco componentes - 57 \
- sing) e o Drools Planner é utilizado para a resolução componentes não serão abordados neste artigo, para dos componentes relacionados ao gerenciamento de Engine em inglês) enquanto o Drools Guvnor é um pouco mais cada um destes componentes. Production (rules) Interference Engine Rete00 / Leaps Pattern Matcher Agenda Figura 1. Drools Expert ponente suporta regras, fatos, prioridade entre as - zada pela aplicação que usa as regras para a tomada uma regra para determinados valores e esta regra re- regra. Uma regra é formada por uma ou mais condi- - - condição é avaliada antes das outras regras, ou seja, caso ela retorne falso as outras regras nem serão avaliadas pelo Motor. - objetos/containers que contêm os dados avaliados pelas regras são armazenados em uma Memória de - - versão otimizada e orientada a objetos do algoritmo - Quando muitas regras retornam verdadeiro para uma - tema que implementa os dois métodos é considerado - e, portanto, reativo. Uma ou mais regras podem ser - - mais submetas. Working (facts) negócio possam ser criadas, editadas, processadas, testadas e implantadas em um repositório de regras. Para fazer a instalação do Drools Guvnor no - - ta webapps to Tomcat. Espere um pou- - / 58
Rule Base Determine possible Workign Memory Fire Rule Rule Found Select Rule to Fire Resolution Strategy No Rule Found exit Rule Base Examine worling memory and goals to see if goals are known true in knowledge base Workign Memory Goal Return True yes Do goals match? Recursively back-chain Return false no (return false to recursive procedure) For each rule condition, recursively backchain with condition goal. Determine next possible conclusions and goals Fire Rule Rule Found Select Rule to Fire Resolution Strategy No Rule Found All recursion are true? exit One more goals failed. Check next matching rule. yes Figura 3. Goals found to be true, exist, returning true true» Browse: permite que seja feita uma busca de regras por status e categoria.» Knowledge Bases: possui todas as regras organizadas por pacotes.» QA (Quality Assurance): permite que sejam - namento das regras.» Package snapshots: - - histórico.» Administration: apresenta as seguintes fun- 59 \
vamento de regras, log de eventos, permis- repositório de regras. usadas para a criação da regra:» Business Rule Guided Editor: permite que uma regra seja criada usando um editor de re-» DSL Business Rule (Text Editor): permite que escrito em uma linguagem DSL.» DRL Rule (Techinical Rule Text Editor): permite que uma regra seja criada em um ar- ols Rule Language).» Decision Table: permite que uma regra seja» Decision Table Web Guided Editor: permite que uma regra seja criada usando uma Tabela de Decisão através de um editor visual do Figura 4. Tela inicial do Drools Guvnor. - - no botão Choose File e selecione o arquivo mortga- - com o Drools a criação das regras possa ser feita dentro do Eclipse e depois integradas a um repositório de regras. manager do Eclipse e crie um novo site apontando para a seguinte url: http://downloads.jboss.com/dro- - Figura 6. Instalando o plugin do Drools no Eclipse. rio de regras de exemplo. Criando um projeto de exemplo usando o wizard do Eclipse (projeto mundojdrools-sample) - de todos eles):» quivo Sample.drl.» - - Test.java).» DroolsTest.» vés da chamada do método newstatefulsession.» / 60
objeto da classe Message.» - DroolsTest.java. Figura 7. Erro ao executar a classe DroolsTest. - - vamente a classe DroolsTest.java e veja o resultado. Tente agora alterar o valor do campo status do Crie novos objetos do tipo Message, não se esqueça de adicionar eles na Memória de Trabalho Criando outro projeto de regras a partir cria um novo projeto de regras sem nenhuma opção selecionada. package mundoj; import mundoj.conta; rule inicial when Conta( saldo < 100 ) // condição then System.out.println( Saldo da conta do banco é menor do que 100 ); // consequência End Esta regra possui apenas uma condição, se o Saldo da Conta for menor do que a mensagem Saldo da no Console do Eclipse. package mundoj; public class Conta { private long saldo; Figura 8. Rodando novamente a classe DroolsTest. Entendendo o que você acaba de fazer: dois atributos, uma String message e um int status. - tada quando o status do objeto Message informado Quando esta classe é criada pelo nosso Eclipse - public long getsaldo() { return saldo; public void setsaldo(long balance) { this.saldo = balance; package mundoj; import java.io.inputstreamreader; import java.io.reader; import org.drools.rulebase; import org.drools.rulebasefactory; 61 \
import org.drools.workingmemory; import org.drools.compiler.packagebuilder; import org.drools.rule.package; public class TestaRegras { public static void main(string[] args) throws Exception { /* uma Rule Base (ou base de conhecimento) é * reponsável por criar a * memória de trabalho onde irá ser feito o match das regras */ RuleBase rulebase = null; /* aqui eu estou lendo o arquivo onde estão declaradas as minhas regras */ Reader source = new InputStreamReader( TestaRegras.class.getResourceAsStream( /regra.drl )); PackageBuilder builder = new (); /*aqui eu estou adicionando no Buider de pacotes as regras lidas no passo anterior */ builder.addpackagefromdrl(source); Package pkg = builder.getpackage(); rulebase = RuleBaseFactory. (); /* aqui eu estou adicionando na Rule Base o de regras */ rulebase.addpackage(pkg); /* aqui eu crio a minha Working Memory ou memória de trabalho que é o Runtime onde eu irei disparar as minhas regras */ WorkingMemory workingmemory = rulebase.newstatefulsession(); /* aqui eu crio o meu objeto Conta, que é o fato sobre o qual eu irei aplicar as minhas regras */ Conta account = new Conta(); account.setsaldo(-1); /* aqui eu insiro na minha memória de trabalho os dados/fatos criados */ workingmemory.insert(account); /* aqui eu disparo todas as regras existentes na minha memória de trabalho */ workingmemory. (); - Crie uma nova regra usando a opção DRL Rule rule inicial no-loop true dialect mvel when c: Conta( saldo < 0 ) then c.setstatus( Saldo da Conta é negativo! ); update(c); end novo projeto de regras deve ser criado no Guvnor. Figura 9. Criando o projeto no Guvnor e executando as regras no Eclipse (projeto mundoj-client-guvnor) teriormente no Eclipse direto no Guvnor e depois - Selecione o pacote criado e crie um novo De- Figura 10. / 62
Figura 11 Figura 15 Figura 12 Figura 16 novo projeto de regras no eclipse e coloque o código package mundoj; import org.drools.knowledgebase; import org.drools.agent.knowledgeagent; import org.drools.agent.knowledgeagentfactory; import import org.drools.io.resource; import org.drools.io.resourcefactory; import org.drools.runtime.statelessknowledgesession; public class ClientGuvnor { Figura 13 Figura 14. public static void main(string[] args) { Resource xml = null; KnowledgeAgent kagent = null; KnowledgeBase kbase = null; StatelessKnowledgeSession workingmemory = null; { xml = ResourceFactory.newClassPathResource( mundoj.xml ); kagent = KnowledgeAgentFactory. newknowledgeagent( myagent ); kagent. (xml); kbase = kagent. (); FactType ftype = kbase. ( mundoj, Conta ); Object conta = ftype.newinstance(); ftype.set(conta, saldo, -1); workingmemory = kbase. 63 \
newstatelessknowledgesession(); workingmemory.execute(conta); System.out.println(fType.get(conta, status )); catch (Exception e) { e.printstacktrace(); { kagent.dispose(); - gras. <change-set xmlns= http://drools.org/drools-5.0/ change-set xmlns:xs= http://www.w3.org/2001/xmlschema-instance xs:schemalocation= http://drools.org/drools-5.0/ change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules /trunk/drools-api/src/main/resources/change-set- 1.0.0.xsd > <add> <resource source= http://localhost:8090/droolsguvnor/org.drools.guvnor.guvnor/package/mundoj/ LATEST type= PKG /> </add> </change-set> Muitas vezes, ao iniciar o desenvolvimento de um software perdemos bastante tempo escolhen- não dando a devida importância que as regras de ne- profundamente estas regras quanto à pessoa que lida disso, como sabemos, o processo de negócio é que produz valor para os clientes e não o software. - gras de negócio sem a necessidade da ajuda do espe- importância, proporcionando com que estas regras criadas separadamente possam ser aproveitadas por todos os softwares que dependam delas na empresa. Durante a leitura do artigo, realizamos uma in- Engine). Em seguida, mostramos como utilizar o Drools Guvnor como uma interface web para o Gerencia- - do Eclipe para o desenvolvimento de projetos para o artigo foi o de chamar a atenção do leitor para a utilidade da tecnologia. http://www.jboss.org/drools/downloads > Update Site para instalar o plugin do Drools no Eclipse http://downloads.jboss.com/drools/updatesite3.3/ > Documentação Drools Guvnor > Documentação Drools Expert I> ntrodução ao Drools Guvnor http://en.wikipedia.org/wiki/declarative_programming http://en.wikipedia.org/wiki/imperative_programming system > Implementando a Lógica de Negócio com o Drools (Artigo http://blog.athico.com/ guide/html_single/index.html /referências / 64