Introdução ao Drools
1. Visão geral
Drools é uma solução de Sistema de Gerenciamento de Regras de Negócios (BRMS). Ele fornece um mecanismo de regras que processa fatos e produz saída como resultado do processamento de regras e fatos. A centralização da lógica de negócios torna possível introduzir mudanças de forma rápida e barata.
Também preenche a lacuna entre as equipes técnica e de negócios, fornecendo um recurso para escrever as regras em um formato fácil de entender.
2. Dependências do Maven
Para começar com o Drools, precisamos primeiro adicionar algumas dependências em nossopom.xml:
org.kie
kie-ci
7.1.0.Beta1
org.drools
drools-decisiontables
7.1.0.Beta1
A versão mais recente de ambas as dependências está disponível no Repositório Central Maven comokie-ciedrools-decisiontables.
3. Drools Basics
Vamos examinar os conceitos básicos de Drools:
-
Facts - representa dados que servem como entrada para regras
-
Working Memory – um armazenamento comFacts, onde são usados para correspondência de padrões e podem ser modificados, inseridos e removidos
-
Rule - representa uma única regra que associaFacts com ações correspondentes. Ele pode ser escrito em Drools Rule Language nos arquivos.drl ou comoDecision Table em uma planilha Excel
-
Knowledge Session - contém todos os recursos necessários para as regras de disparo; todos osFacts são inseridos na sessão e, em seguida, as regras correspondentes são disparadas
-
Knowledge Base - representa o conhecimento no ecossistema Drools, tem as informações sobre os recursos ondeRules são encontrados, e também cria oKnowledge Session
-
*Module* *–* Um módulo contém várias bases de conhecimento que podem realizar diferentes sessões
4. Configuração Java
Para disparar regras em um dado dado, precisamos instanciar as classes fornecidas pelo framework com informações sobre a localização dos arquivos de regra e oFacts:
4.1. KieFileSystem
Primeiro, precisamos definir o beanKieFileSystem; este é um sistema de arquivos na memória fornecido pela estrutura. O código a seguir fornece o contêiner para definir os recursos do Drools, como arquivos de regras, tabelas de decisão, programaticamente:
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(
ResourceFactory.newClassPathResource(
RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
Aqui,RULES_PATH denota a localização dos arquivos de regra no sistema de arquivos. Aqui estamos lendo os arquivos declasspath, que normalmente é/src/main/resources no caso de um projeto Maven.
4.2. KieContainer
Em seguida, precisamos definir oKieContainer, que é um espaço reservado para todos osKieBases para umKieModule. KieContainer específico, criado com a ajuda de outros beans, incluindoKieFileSystem, KieModule,eKieBuilder.
O métodobuildAll() invocado emKieBuilder cria todos os recursos e os vincula aKieBase.. Executa com sucesso apenas quando é capaz de encontrar e validar todos os arquivos de regra:
public KieContainer kieContainer() throws IOException {
KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices()
.newKieBuilder(kieFileSystem())
.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
4.3. KieSession
As regras são disparadas abrindo um beanKieSession - que pode ser recuperado emKieContainer:
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
5. Regras de implementação
Agora que terminamos a configuração, vamos dar uma olhada em algumas opções para criar regras.
Exploraremos a implementação da regra por meio de um exemplo de categorização de um candidato para uma função específica, com base em seu salário atual e nos anos de experiência que ele possui.
5.1. Arquivo de regras do Drools (.drl)
Simplificando, o arquivo de regras Drools contém todas as regras de negócios.
A rule includes a When-Then construct, aqui a seçãoWhen lista a condição a ser verificada e a seçãoThen lista a ação a ser tomada se a condição for atendida:
package com.example.drools.rules;
import com.example.drools.model.Applicant;
global com.example.drools.model.SuggestedRole suggestedRole;
dialect "mvel"
rule "Suggest Manager Role"
when
Applicant(experienceInYears > 10)
Applicant(currentSalary > 1000000 && currentSalary <=
2500000)
then
suggestedRole.setRole("Manager");
end
Esta regra pode ser disparada inserindo os fatosApplicanteSuggestedRole emKieSession:
public SuggestedRole suggestARoleForApplicant(
Applicant applicant,SuggestedRole suggestedRole){
KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(applicant);
kieSession.setGlobal("suggestedRole",suggestedRole);
kieSession.fireAllRules();
// ...
}
Ele testa duas condições na instânciaApplicant e, em seguida, com base no cumprimento de ambas as condições, define o campoRole no objetoSuggestedRole.
Isso pode ser verificado executando o teste:
@Test
public void whenCriteriaMatching_ThenSuggestManagerRole(){
Applicant applicant = new Applicant("David", 37, 1600000.0,11);
SuggestedRole suggestedRole = new SuggestedRole();
applicantService.suggestARoleForApplicant(applicant, suggestedRole);
assertEquals("Manager", suggestedRole.getRole());
}
Neste exemplo, usamos algumas palavras-chave fornecidas pelo Drools. Vamos entender seu uso:
-
package – este é o nome do pacote que especificamos emkmodule.xml, o arquivo de regras está localizado dentro deste pacote
-
import - é semelhante à instrução Javaimport, aqui precisamos especificar as classes que estamos inserindo noKnowledgeSession
-
global – isso é usado para definir uma variável de nível global para uma sessão; isso pode ser usado para passar o parâmetro de entrada ou para obter um parâmetro de saída para resumir as informações para uma sessão
-
dialect - um dialeto especifica a sintaxe empregada nas expressões na seção de condição ou seção de ação. Por padrão, o dialeto é Java. O Drools também oferece suporte ao dialetomvel; é uma linguagem de expressão para aplicativos baseados em Java. Ele suporta o acesso a campos e métodos / métodos
-
rule - define um bloco de regra com um nome de regra
-
when - especifica uma condição de regra, neste exemplo as condições que são verificadas sãoApplicant tendoexperienceInYears mais de dez anos ecurrentSalary em um determinado intervalo
-
then – este bloco executa a ação quando as condições no blocowhen se encontram. Neste exemplo, a funçãoApplicant é definida como Gerente
5.2. Tabelas de decisão
Uma tabela de decisão fornece a capacidade de definir regras em uma planilha do Excel pré-formatada. A vantagem dos Drools fornecidos pela Decision Table é que eles são fáceis de entender, mesmo para uma pessoa não técnica.
Além disso, é útil quando existem regras semelhantes, mas com valores diferentes, neste caso, é mais fácil adicionar uma nova linha na planilha do excel em contraste com escrever uma nova regra em arquivos.drl. Vamos ver qual é a estrutura de uma tabela de decisão com um exemplo de aplicação do rótulo em um produto com base no tipo de produto:
A Tabela de Decisão está agrupada em diferentes seções, a superior é como uma seção de cabeçalho onde especificamos oRuleSet (ou seja, pacote onde os arquivos de regra estão localizados),Import (classes Java a serem importadas) eNotes (comentários sobre o propósito das regras).
A seção central onde definimos as regras é chamadaRuleTable, que agrupa as regras que são aplicadas ao mesmo objeto de domínio.
Na próxima linha, temos os tipos de colunaCONDITIONeACTION. Dentro dessas colunas, podemos acessar as propriedades do objeto de domínio mencionado em uma linha e seus valores nas linhas subseqüentes.
O mecanismo para disparar as regras é semelhante ao que vimos com arquivos.drl.
Podemos verificar o resultado da aplicação dessas regras executando o teste:
@Test
public void whenProductTypeElectronic_ThenLabelBarcode() {
Product product = new Product("Microwave", "Electronic");
product = productService.applyLabelToProduct(product);
assertEquals("BarCode", product.getLabel());
}
6. Conclusão
Neste rápido artigo, exploramos o uso de Drools como um mecanismo de regras de negócios em nosso aplicativo. Também vimos as várias maneiras pelas quais podemos escrever as regras na linguagem de regras do Drools, bem como em uma linguagem de fácil compreensão em planilhas.
Como sempre, o código completo deste artigo está disponívelover on GitHub.