Drools usando reglas de archivos de Excel

1. Información general

Drools tiene soporte para administrar reglas comerciales en formato de hoja de cálculo.

En este artículo, veremos un ejemplo rápido del uso de Drools para administrar reglas comerciales usando un archivo de Excel.

2. Dependencias de Maven

Agreguemos las dependencias requeridas de Drools en nuestra aplicación:

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

La última versión de estas dependencias se puede encontrar en kie-ci y drools-decisiontables.

3. Definición de reglas en Excel

Para nuestro ejemplo, definamos reglas para determinar el descuento según el tipo de cliente y la cantidad de años como cliente:

  • Los clientes individuales con más de 3 años obtienen un 15% de descuento
  • Los clientes individuales con menos de 3 años obtienen un 5% de descuento
  • Todos los clientes comerciales obtienen un 20% de descuento

3.1. El archivo de Excel

Comencemos con la creación de nuestro archivo de Excel según la estructura específica y las palabras clave requeridas por Drools:

Para nuestro ejemplo simple, hemos utilizado el conjunto de palabras clave más relevante:

  • RuleSet : indica el comienzo de la tabla de decisiones
  • Importar : clases de Java utilizadas en las reglas
  • RuleTable : indica el comienzo del conjunto de reglas
  • Nombre : nombre de la regla
  • CONDICIÓN : el fragmento de código de la condición que se va a comparar con los datos de entrada. Una regla debe contener al menos una condición
  • ACCIÓN : el fragmento de código de la acción que se debe realizar si se cumplen las condiciones de la regla. Una regla debe contener al menos una acción. En el ejemplo, llamamos setDiscount en el objeto Customer

Además, hemos utilizado la clase Customer en el archivo de Excel. Entonces, creemos eso ahora.

3.2. La clase del cliente

Como puede verse en las CONDICIONES y ACCIÓN en la hoja de Excel, estamos usando un objeto de la clase Cliente para los datos de entrada ( tipo y años ) y para almacenar el resultado ( descuento ).

La clase de cliente :

public class Customer { private CustomerType type; private int years; private int discount; // Standard getters and setters public enum CustomerType { INDIVIDUAL, BUSINESS; } }

4. Creación de una instancia de motor de reglas Drools

Antes de que podamos ejecutar las reglas que hemos definido, tenemos que trabajar con una instancia del motor de reglas Drools. Para eso, tenemos que usar componentes centrales de Kie.

4.1. KieServices

La clase KieServices proporciona acceso a todas las instalaciones de tiempo de ejecución y compilación de Kie. Proporciona varias fábricas, servicios y métodos de utilidad. Entonces, primero consigamos una instancia de KieServices :

KieServices kieServices = KieServices.Factory.get();

Usando KieServices, crearemos nuevas instancias de KieFileSystem , KieBuilder y KieContainer .

4.2. KieFileSystem

KieFileSystem es un sistema de archivos virtual. Agreguemos nuestra hoja de cálculo de Excel:

Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt); 

4.3. KieBuilder

Ahora, cree el contenido de KieFileSystem pasándolo a KieBuilder :

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll();

Si se construye con éxito, crea un KieModule ( cualquier jar producido por Maven con un kmodule.xml en él es un KieModule ).

4.4. KieRepository

El marco agrega automáticamente el KieModule (resultante de la compilación) a KieRepository :

KieRepository kieRepository = kieServices.getRepository();

4.5. KieContainer

Ahora es posible crear un nuevo KieContainer con este KieModule usando su ReleaseId . En este caso, Kie asigna un ReleaseId predeterminado :

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId(); KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId);

4.6. KieSession

Ahora podemos obtener KieSession del KieContainer . Nuestra aplicación interactúa con KieSession , que almacena y ejecuta los datos en tiempo de ejecución:

KieSession kieSession = kieContainer.newKieSession();

5. Ejecución de las reglas

Finalmente, es hora de proporcionar datos de entrada y activar las reglas:

Customer customer = new Customer(CustomerType.BUSINESS, 2); kieSession.insert(customer); kieSession.fireAllRules();

6. Casos de prueba

Agreguemos ahora algunos casos de prueba:

public class DiscountExcelIntegrationTest { private KieSession kSession; @Before public void setup() { Resource dt = ResourceFactory .newClassPathResource("com/baeldung/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. Solución de problemas

Drools convierte la tabla de decisiones a DRL. Debido a eso, lidiar con errores y errores tipográficos en el archivo de Excel puede ser difícil. A menudo, los errores se refieren al contenido de la DRL. Entonces, para solucionar problemas, es útil imprimir y analizar el DRL:

Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); DecisionTableProviderImpl decisionTableProvider = new DecisionTableProviderImpl(); String drl = decisionTableProvider.loadFromResource(dt, null);

8. Conclusión

En este artículo, hemos visto un ejemplo rápido del uso de Drools para administrar las reglas comerciales en una hoja de cálculo de Excel. Hemos visto la estructura y el conjunto mínimo de palabras clave que se utilizarán para definir reglas en un archivo de Excel. A continuación, hemos utilizado componentes de Kie para leer y activar las reglas. Finalmente, escribimos casos de prueba para verificar los resultados.

Como siempre, el ejemplo utilizado en este artículo se puede encontrar en el proyecto Github.