2010-12-08 37 views
9

Actualmente almaceno todos los archivos de reglas en el sistema de archivos (hay muchas versiones de ellos) y cargo las diferentes versiones de ellos en la memoria al inicio. Me gustaría cambiar al almacenamiento de mis archivos de drools en una base de datos y me preguntaba si hay alguna solución o complemento para Drools, lo que facilita esto o ¿debería crear el mío?Drools: reglas de almacenamiento en la base de datos

Gracias.

Respuesta

3

Bueno, es posible que desee ver Guvnor como una forma de proporcionar la gestión de reglas.

Pero, en resumen, no, tendrá que escribir el suyo.

Tenga en cuenta que no necesita un archivo en el medio, puede leer la representación de cadena de la regla de la base de datos y simplemente compilar eso.

1

También enfrenté el mismo escenario. Almacena todos los archivos de reglas en la base de datos.

Al cargar las reglas al inicio de la aplicación, obtuve las reglas de la base de datos y las almacené en una carpeta temporal para compilarlas y colocarlas en Rule Base.

Si la regla cambia durante la ejecución de la aplicación, actualice la regla modificada en Rule Base de la misma manera.

6

Sí, se puede hacer. Todo lo que necesita es la capacidad de obtener InputStream. En mi caso, uso mi propia clase JPA RulePackage para conservar el origen de la regla como byte [], pero puede usar la conexión JDBC directa para acceder a los campos BLOB/CLOB en su esquema DB. Lo importante es salvar también el tipo de fuente regla almacenada, será necesaria cuando la construcción de paquetes de reglas:

switch(rulePackage.getRuleSourceType()) { 
    case DRL: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DRL); 
    break; 
    case EXCEL: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, excelConfig); 
    break; 
    case CSV: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, csvConfig); 
    break; 
    default: 
    throw new Exception("Rule package '" + rulePackage.getName() + "' has unknown type"); 
} 

Se podría considerar el uso de método newInputStreamResource si más aplicable en su caso:

case DRL: 
    kbuilder.add(ResourceFactory.newInputStreamResource(new StringInputStream(myDrlAsString)), ResourceType.DRL); 
    break; 

o

case DRL: 
    kbuilder.add(ResourceFactory.newInputStreamResource(new ByteArrayInputStream(myDrlAsByteArr)), ResourceType.DRL); 
    break; 

Algo así.

4

Sí, puede hacerlo creando paquetes de reglas (archivos .pkg). Esta es la forma compilada/binaria de reglas textuales.

puede especificar el nombre del archivo del paquete al crear el knowledgeBuilder y también la frecuencia con la actualización de las reglas (digamos 30 segundos).

Utilice Guvnor para convertir las reglas de texto a archivos .pkg. Mantenga este archivo en una carpeta donde la aplicación pueda acceder a él.

Vuelva por favor si necesita muestras de código.

0

Una vez que se dedica a almacenar múltiples versiones de reglas en un data store, realmente está buscando las características de Business Rule Management (BRMS) de Guvnor (en Drools 5.x) o Drools-WB/KIE- Bancos de trabajo WB en Drools 6.0.

Esas soluciones se han solucionado para el control de versiones, el almacenamiento y la implementación de versiones de reglas múltiples de fábrica. En resumen, serán más sólidos que una solución interna.

Cuestiones relacionadas