Baba usando regras de arquivos do Excel
*1. Visão geral *
[.s1]#https://www.drools.org/[Drools] has support for managing business rules in a spreadsheet format. #
Neste artigo, veremos um exemplo rápido do uso de Drools para gerenciar regras de negócios usando um arquivo do Excel.
===* 2. Dependências do Maven *
Vamos adicionar as dependências necessárias de Drools em nosso aplicativo:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>7.1.0.Beta2</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.1.0.Beta2</version>
</dependency>
A versão mais recente dessas dependências pode ser encontrada em https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.kie%22%20AND%20a%3A%22kie-ci%22 [kie-ci] e drools-decisiontables
===* 3. Definindo regras no Excel *
Para o nosso exemplo, vamos definir regras para determinar o desconto com base no tipo de cliente e no número de anos como cliente:
-
Clientes individuais com mais de 3 anos recebem 15% de desconto
-
Clientes individuais com menos de 3 anos recebem 5% de desconto *Todos os clientes empresariais recebem 20% de desconto
====* 3.1 O arquivo do Excel *
Vamos começar criando nosso excel file conforme a estrutura específica e as palavras-chave exigido pelo Drools:
link:/wp-content/uploads/2017/06/Drools_Excel.png [imagem:/wp-content/uploads/2017/06/Drools_Excel-300x111.png [imagem, largura = 565, altura = 209]]
Para o nosso exemplo simples, usamos o conjunto de palavras-chave mais relevantes:
-
RuleSet - indica o início da tabela de decisão
-
Import - classes Java usadas nas regras
-
RuleTable - indica o início do conjunto de regras
-
Name - Nome da regra
-
CONDITION - o trecho de código da condição a ser verificada nos dados de entrada. Uma regra deve conter pelo menos uma condição *ACTION - o trecho de código da ação a ser tomada se as condições da regra forem atendidas. Uma regra deve conter pelo menos uma ação. No exemplo, estamos chamando setDiscount no objeto Customer
Além disso, usamos a classe Customer no arquivo do Excel. Então, vamos criar isso agora.
====* 3.2 A classe Customer *
Como pode ser visto nas CONDITIONs e ACTION na planilha do Excel, estamos usando um objeto da classe Customer para os dados de entrada (type e years) e para armazenar o resultado (discount).
A classe Customer:
public class Customer {
private CustomerType type;
private int years;
private int discount;
//Standard getters and setters
public enum CustomerType {
INDIVIDUAL,
BUSINESS;
}
}
===* 4. * Criando uma instância do mecanismo de regras de Drools
Antes de podermos executar as regras que definimos, precisamos trabalhar com uma instância do mecanismo de regras Drools. Para isso, temos que usar os principais componentes do Kie.
4.1 KieServices
The KieServices class provides access to all the Kie build and runtime facilities. It provides several factories, services, and utility methods. So, let’s first get hold of a KieServices instance:
KieServices kieServices = KieServices.Factory.get();
Usando o KieServices, vamos criar novas instâncias de KieFileSystem, KieBuilder e KieContainer.
4.2 KieFileSystem
KieFileSystem é um sistema de arquivos virtual. Vamos adicionar nossa planilha do Excel:
Resource dt
= ResourceFactory
.newClassPathResource("com//drools/rules/Discount.xls",
getClass());
KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);
4.3 KieBuilder
Agora, crie o conteúdo do KieFileSystem passando-o para KieBuilder:
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
Se construído com êxito, ele cria um KieModule (qualquer frasco produzido por Maven com um kmodule.xml nele, é um KieModule).
4.4 KieRepository
A estrutura adiciona automaticamente o KieModule (resultante da construção) ao KieRepository:
KieRepository kieRepository = kieServices.getRepository();
4.5 KieContainer
Agora é possível criar um novo KieContainer com esse KieModule usando seu ReleaseId. Nesse caso, Kie atribui um _ReleaseId padrão: _
ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
= kieServices.newKieContainer(krDefaultReleaseId);
4.6 KieSession
Agora podemos obter KieSession no KieContainer. Nosso aplicativo interage com o KieSession, que armazena e executa nos dados de tempo de execução:
KieSession kieSession = kieContainer.newKieSession();
*5. Executando as regras *
Finalmente, é hora de fornecer dados de entrada e acionar as regras:
Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);
kieSession.fireAllRules();
===* 6. Casos de teste *
Vamos agora adicionar alguns casos de teste:
public class DiscountExcelIntegrationTest {
private KieSession kSession;
@Before
public void setup() {
Resource dt
= ResourceFactory
.newClassPathResource("com//drools/rules/Discount.xls",
getClass());
kSession = new DroolsBeanFactory().getKieSession(dt);
}
@Test
public void
giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 15);
}
@Test
public void
giveIndvidualRecent_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 5);
}
@Test
public void
giveBusinessAny_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.BUSINESS, 0);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 20);
}
}
===* 7. Solução de problemas *
Drools converte a tabela de decisão no link:/drools [DRL]. Por esse motivo, pode ser difícil lidar com erros e erros de digitação no arquivo do Excel. Geralmente, os erros se referem ao conteúdo do DRL. Portanto, para solucionar problemas, é útil imprimir e analisar o DRL:
Resource dt
= ResourceFactory
.newClassPathResource("com//drools/rules/Discount.xls",
getClass());
DecisionTableProviderImpl decisionTableProvider
= new DecisionTableProviderImpl();
String drl = decisionTableProvider.loadFromResource(dt, null);
===* 8. Conclusão*
Neste artigo, vimos um exemplo rápido do uso de Drools para gerenciar regras de negócios em uma planilha do Excel. Vimos a estrutura e o conjunto mínimo de palavras-chave a serem usadas na definição de regras em um arquivo do Excel. Em seguida, usamos os componentes do Kie para ler e disparar as regras. Por fim, escrevemos casos de teste para verificar os resultados.
Como sempre, o exemplo usado neste artigo pode ser encontrado em o projeto Github.