Drools POC es una aplicación de demostración que integra Apache Drools (motor de reglas empresariales) con Spring Boot. El proyecto permite procesamiento dinámico de entidades genéricas mediante reglas de negocio programadas en lenguaje DRL (Drools Rule Language).
La aplicación demuestra cómo cargar y ejecutar reglas de Drools desde archivos externos, transformar datos genéricos basados en reglas específicas y exponer una API REST para orquestar el procesamiento.
- Spring Boot 3.4.1 - Framework para aplicaciones Java modulares y escalables
- Spring Web - Para construcción de REST APIs
- Java 17 - Lenguaje de programación
- Apache Drools 9.44.0.Final - Motor de reglas empresariales
kie-api- API del kernel de inteligencia empresarialdrools-core- Núcleo del motor Droolsdrools-compiler- Compilador de reglas DRLdrools-decisiontables- Soporte para tablas de decisiónkie-ci- Integración continua para KIE
- Jackson - Librería para serialización/deserialización JSON
- Jackson Databind - Binding de datos JSON a objetos Java
- Spring Boot DevTools - Herramientas de desarrollo para recarga automática
- Spring Boot Starter Test - Framework de testing con JUnit 5
- Clase principal de la aplicación Spring Boot
- Punto de entrada que inicia la aplicación
- Configura el escaneo de componentes para todos los paquetes del proyecto
- Anotaciones:
@SpringBootApplication- Habilita la configuración automática de Spring Boot@ComponentScan- Escanea componentes en paquetes específicos
- Servicio principal para aplicar reglas de Drools
- Responsabilidades:
- Cargar archivos de reglas (.drl) basados en el tipo de entidad
- Crear y compilar el contenedor KIE (Knowledge Container)
- Ejecutar las reglas sobre las entidades genéricas
- Retornar entidades transformadas
- Método clave:
applyRules(GenericEntity)- Aplica reglas y transforma datos - Directorio de reglas:
C:/drools-rules/(configurable)
- Controlador REST que expone la API de transformación
- Clase anidada:
TransformController - Endpoint:
POST /api/transform- Recibe una entidad genérica y retorna la entidad transformada- Ejemplo:
POST http://localhost:8080/api/transform
- Inyección de dependencias: Recibe
DroolsServicecomo Bean
- Modelo de datos genérico para entrada
- Atributos:
type(String) - Tipo de entidad (ej: "person", "vehicle")body(Map<String, Object>) - Cuerpo dinámico con datos variados
- Define la estructura para cualquier tipo de documento
- Basado en principios de entidad genérica para flexibilidad
- Modelo de datos para salida transformada
- Atributos:
result(Map<String, Object>) - Resultado transformado por las reglas
- Contiene el resultado después de aplicar las reglas de negocio
- Clase de configuración (actualmente deshabilitada)
- Potencial para:
- Definir Beans de configuración de KIE
- Crear contenedores KIE reutilizables
- Centralizar la configuración de Drools
drools-dynamic-class/
├── pom.xml # Configuración Maven
├── mvnw, mvnw.cmd # Maven wrapper
├── src/
│ ├── main/
│ │ ├── java/com/poc/droolspoc/
│ │ │ ├── DroolsPocApplication.java # App principal
│ │ │ ├── config/
│ │ │ │ └── DroolsConfig.java # Config Drools
│ │ │ ├── controller/
│ │ │ │ └── DroolsController.java # REST Controller
│ │ │ ├── service/
│ │ │ │ └── DroolsService.java # Servicio de reglas
│ │ │ └── domain/
│ │ │ ├── GenericEntity.java # Entidad de entrada
│ │ │ └── TransformedEntity.java # Entidad de salida
│ │ └── resources/
│ │ ├── application.properties # Propiedades de la app
│ │ ├── rules/
│ │ │ ├── person.drl # Reglas para Person
│ │ │ └── vehicle.drl # Reglas para Vehicle
│ │ └── json/
│ │ ├── person.json # Datos de ejemplo
│ │ └── vehicle.json # Datos de ejemplo
│ └── test/
│ └── java/com/poc/droolspoc/
│ └── DroolsPocApplicationTests.java # Tests
Define reglas para transformación de entidades de tipo "person":
rule "Transform Person"
when
$input : GenericEntity(type == "person")
then
Map<String, Object> body = $input.getBody();
Map<String, Object> transformedResult = new java.util.HashMap<>();
transformedResult.put("NombreCliente", body.get("nombre"));
transformedResult.put("ApellidoCliente", body.get("apellido"));
transformedResult.put("EdadCliente", body.get("edad"));
transformedResult.put("DirecciónCasa", body.get("direccion"));
transformedEntity.setResult(transformedResult);
end
Define reglas para transformación de entidades de tipo "vehicle"
- Java 17 o superior
- Maven 3.8+
- Crear directorio de reglas:
C:/drools-rules/
-
Clonar o descargar el proyecto
cd drools-dynamic-class -
Compilar el proyecto
./mvnw clean install
-
Ejecutar la aplicación
./mvnw spring-boot:run
-
Verificar que está corriendo
- La aplicación estará disponible en:
http://localhost:8080
- La aplicación estará disponible en:
URL: POST http://localhost:8080/api/transform
Headers:
Content-Type: application/json
Body (ejemplo person):
{
"type": "person",
"body": {
"nombre": "Juan",
"apellido": "Pérez",
"edad": 30,
"direccion": "Calle Principal 123"
}
}Respuesta Esperada:
{
"type": "person",
"transformedEntity": {
"result": {
"NombreCliente": "Juan",
"ApellidoCliente": "Pérez",
"EdadCliente": 30,
"DirecciónCasa": "Calle Principal 123"
}
}
}Para agregar nuevos tipos de entidades:
- Crear archivo de reglas en
C:/drools-rules/con nombre{tipo}.drl - Definir reglas siguiendo la sintaxis DRL
- Enviar solicitud POST con el nuevo tipo en GenericEntity
- El servicio cargará automáticamente las reglas
- Las reglas deben estar en el directorio configurado:
C:/drools-rules/ - Las reglas se compilan dinámicamente cada vez que se invocan
- TransformedEntity actúa como variable global en la ejecución de reglas