Introducción a Drools

1. Información general

Drools es una solución de Business Rule Management System (BRMS). Proporciona un motor de reglas que procesa hechos y produce resultados como resultado del procesamiento de reglas y hechos. La centralización de la lógica empresarial permite introducir cambios de forma rápida y económica.

También cierra la brecha entre los equipos de Negocios y Técnicos al proporcionar una facilidad para escribir las reglas en un formato que es fácil de entender.

2. Dependencias de Maven

Para comenzar con Drools, primero debemos agregar un par de dependencias en nuestro pom.xml :

 org.kie kie-ci 7.1.0.Beta1   org.drools drools-decisiontables 7.1.0.Beta1 

La última versión de ambas dependencias está disponible en Maven Central Repository como kie-ci y drools-decisiontables.

3. Conceptos básicos de la baba

Vamos a ver los conceptos básicos de Drools:

  • Hechos : representa datos que sirven como entrada para las reglas.
  • Memoria de trabajo : un almacenamiento con hechos, donde se utilizan para la coincidencia de patrones y se pueden modificar, insertar y eliminar
  • Regla : representa una sola regla que asocia hechos con acciones coincidentes. Se puede escribir en Drools Rule Language en losarchivos .drl o como tabla de decisiones en una hoja de cálculo de Excel.
  • Sesión de conocimientos : contiene todos los recursos necesarios para ejecutar las reglas; todos los hechos se insertan en la sesión y luego se activan las reglas coincidentes
  • Base de conocimiento : representa el conocimiento en el ecosistema Drools, tiene la información sobre los recursos dondese encuentran las Reglas y también crea la Sesión de conocimiento.
  • Módulo : un módulo contiene múltiples bases de conocimiento que pueden albergar diferentes sesiones

4. Configuración de Java

Para activar reglas en un dato dado, necesitamos instanciar las clases proporcionadas por el marco con información sobre la ubicación de los archivos de reglas y los hechos:

4.1. KieFileSystem

Primero, necesitamos configurar el bean KieFileSystem ; este es un sistema de archivos en memoria proporcionado por el marco. El siguiente código proporciona el contenedor para definir los recursos de Drools como archivos de reglas, tablas de decisiones, mediante programación:

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; }

Aquí RULES_PATH denota la ubicación de los archivos de reglas en el sistema de archivos. Aquí estamos leyendo los archivos de classpath, que normalmente es / src / main / resources en el caso de un proyecto Maven.

4.2. KieContainer

A continuación, debemos configurar el KieContainer, que es un marcador de posición para todas las KieBases de un KieModule en particular . KieContainer se crea con la ayuda de otros beans, incluidos KieFileSystem, KieModule y KieBuilder.

El método buildAll () invocado en KieBuilder crea todos los recursos y los vincula a KieBase. Se ejecuta correctamente solo cuando puede encontrar y validar todos los archivos de reglas:

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

Las reglas se activan al abrir un bean KieSession , que se puede recuperar de KieContainer:

public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); }

5. Normas de ejecución

Ahora que hemos terminado con la configuración, echemos un vistazo a un par de opciones para crear reglas.

Exploraremos la implementación de la regla con un ejemplo de categorización de un solicitante para un puesto específico, según su salario actual y la cantidad de años de experiencia que tiene.

5.1. Archivo de regla Drools ( .drl )

En pocas palabras, el archivo de reglas Drools contiene todas las reglas comerciales.

Una regla incluye una construcción When-Then , aquí la sección When enumera la condición que se debe verificar, y la sección Then enumera la acción a tomar si se cumple la condición:

package com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.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 regla se puede activar insertando los hechos Solicitante y Rol sugerido en KieSession:

public SuggestedRole suggestARoleForApplicant( Applicant applicant,SuggestedRole suggestedRole){ KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(applicant); kieSession.setGlobal("suggestedRole",suggestedRole); kieSession.fireAllRules(); // ... }

Prueba dos condiciones en la instancia del Solicitante y luego, basándose en el cumplimiento de ambas condiciones, establece el campo Rol en el objeto SuggestedRole .

Esto se puede verificar ejecutando la prueba:

@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()); }

En este ejemplo, hemos utilizado algunas palabras clave proporcionadas por Drools. Entendamos su uso:

  • paquete: este es el nombre del paquete que especificamos en kmodule.xml, el archivo de reglas se encuentra dentro de este paquete
  • importar : esto es similar a ladeclaración de importación de Java, aquí necesitamos especificar las clases que estamos insertando en la KnowledgeSession
  • global: se utiliza para definir una variable de nivel global para una sesión; esto se puede utilizar para pasar un parámetro de entrada o para obtener un parámetro de salida para resumir la información de una sesión
  • dialecto - un dialecto especifica la sintaxis empleada en las expresiones en la sección de condición o sección de acción. Por defecto, el dialecto es Java. Las babas también apoyan el dialecto mvel ; es un lenguaje de expresión para aplicaciones basadas en Java. Admite el acceso al campo y al método / captador
  • regla : esto define un bloque de reglas con un nombre de regla
  • cuando : esto especifica una condición de la regla, en este ejemplo las condiciones que se marcan son el solicitante que tiene experiencia en años más de diez años y el salario actual en un cierto rango
  • then – this block executes the action when the conditions in the when block met. In this example, the Applicant role is set as Manager

5.2. Decision Tables

A decision table provides the capability of defining rules in a pre-formatted Excel spreadsheet. The advantage with Drools provided Decision Table is that they are easy to understand even for a non-technical person.

Also, it is useful when there are similar rules, but with different values, in this case, it is easier to add a new row on excel sheet in contrast to writing a new rule in .drl files. Let's see what the structure of a decision table with an example of applying the label on a product based on the product type:

The Decision Table is grouped in different sections the top one is like a header section where we specify the RuleSet (i.e. package where rule files are located), Import (Java classes to be imported) and Notes (comments about the purpose of rules).

The central section where we define rules is called RuleTable which groups the rules which are applied to the same domain object.

In the next row, we have column types CONDITION and ACTION. Within these columns, we can access the properties of the domain object mentioned in one row and their values in the subsequent rows.

The mechanism to fire the rules is similar to what we have seen with .drl files.

Podemos verificar el resultado de aplicar estas reglas ejecutando la prueba:

@Test public void whenProductTypeElectronic_ThenLabelBarcode() { Product product = new Product("Microwave", "Electronic"); product = productService.applyLabelToProduct(product); assertEquals("BarCode", product.getLabel()); }

6. Conclusión

En este artículo rápido, hemos explorado el uso de Drools como motor de reglas comerciales en nuestra aplicación. También hemos visto las múltiples formas en que podemos escribir las reglas en el lenguaje de reglas de Drools, así como en un lenguaje fácil de entender en hojas de cálculo.

Como siempre, el código completo de este artículo está disponible en GitHub.