Simplificando as Regras: Uso de JBoss Rules (Drools)
Posted by: Edgar Silva in Engenharia de Sofware, greenbox, javaPense aqueles momentos que você tem um grande sistema em produção e várias regras de negócios são mudadas devido a movimentos de mercados, ou simplesmente “eventos” internos do seu ERP, como baixa em estoque, ou aumento de vendas, atraso de entregas e etc… Imagine os tipos de aplicações que sofrem mudanças e compilações diárias devido a suas regras de negócio, vida bastante complicada nao é?
Há um projeto na empresa que deveremos usar alguns agentes inteligentes para evitar recompilação em cenários das regras de negócios devemos usar o JBoss Rules (Drools), para isto, bolei alguns facilitadores para abstrair seu uso, caso num futuro alguém queria usar o Jess, a mudança será natural. O mais interessante, é que já há uma JSR que trata também estas questões de engine de regras (rules) , que é a JSR 094.
Vou aproveitar este post, para dar algumas idéias de arquitetura e design de um mecanismo de execução de regras e alguns exemplos simples. Primeiramente uma interface que encapsula o processamento de regras:
[JAVA]
import javax.rules.RuleException;
public interface RuleProcessor
public void execute(Object o) throws RuleException;
}
[/JAVA]
Uma classe Abstrata que trata algumas peculiaridades do Drools:
[JAVA]
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
public class AbstractDroolsRulesExecutor {
protected static RuleBase readRuleBase(String sourceDRL) throws Exception {
//read in the source
Reader source = new InputStreamReader(AbstractDroolsRulesExecutor.class.getResourceAsStream(sourceDRL));
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( source );
Package pkg = builder.getPackage();
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
[/JAVA]
Um executador padrão para regras via Drools.
[JAVA]
import javax.rules.RuleException;
import org.drools.WorkingMemory;
public class DroolsExecutor extends AbstractDroolsRulesExecutor implements RuleProcessor
public void execute(Object o) throws RuleException {
WorkingMemory wM ;
try {
wM = readRuleBase(”/”+o.getClass().getSimpleName()+”.drl”).newWorkingMemory();
wM.assertObject(o);
wM.fireAllRules();
} catch (Exception e) {
e.printStackTrace();
new RuleException(”Falha ao buscar a Regra : ” + e.getMessage());
}
}
}
[/JAVA]
Sendo assim, com base no nome da classe do objeto passado para ser validado, carregamos um arquivo de regras, e ai disparamos todas as regras associadas. Veja a seguir o exemplo do arquivo de regras:
[java]
#created on: 15/Fev/2007
package com.cardif.erp.produtos
import com.cardif.erp.produtos.Produto;
#list any import classes here.
#declare any global variables here
rule “Estoque”
when
p : Produto( estoque ==0)
then
System.out.print(”Estoque Zerado, por favor reveja!”);
p.dispatch();
end
rule “NomeProduto”
when
p : Produto( nome ==”Seguro”)
then
System.out.print(”Para seguros nao posso fazer isso…”);
p.dispatch();
end
[/java]
Este arquivo usa uma DSL específica, simples e fácil para codificação, porém podemos criar dicionários baseados na linguagem humana, do tipo:
“envie um email para o {destinatario} quando o estoque for de {risco}”
Imagine que desta forma até seus usuários podem validar suas regras de negócio. Usando as classes que mostrei nesste post, você pode testar as regras de forma extremamente fáceis, veja este exemplo:
[java]
Produto pro = new Produto();
pro.setNome(”Seguro”);
pro.setEstoque(0);
DroolsExecutor d = new DroolsExecutor();
d.execute(pro);
System.out.println(”Executado”);
[/java]


Entries (RSS)