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.