Jugando con Drools 5.0 – #1 Drools Expert

drools_logoIntroducción a Drools Expert

Básicamente vamos a ver un ejemplo sencillo de como Drools Expert nos permite expresar reglas de negocios, para dejar ejemplos simples de como se expresan las reglas y de las interacciones que podemos tener entre ellas.

En este post veremos solamente la estructura del proyecto, las dependencias y las lineas básicas que necesitamos para poder hacer uso del framework. En el siguiente post veremos como esta compuesto el conocimiento, nuestro modelo de objetos y que podemos hacer con el.

Por esto mismo, la idea principal de estos dos primeros posts sobre Drools Expert, es documentar y dejar un ejemplo sencillo para que la gente que no conoce el framework, pueda ir de a poco introduciendoce en cada uno de los submódulos de Drools.

En estos posts voy a utilizar la versión 5.0 del framework cuyas APIs estan orientadas al conocimiento en general. Asi es, es tan genérica como para permitirnos definir el conocimiento que tenemos en una situación de negocio en particular. Por lo tanto veran que toda la terminología que antes se usaba, como por ejemplo RuleBase o WorkingMemory (cuando estaba solamente orientado a reglas de negocio, en la version 4.0.7 o anterior), ahora estas son mucho mas genéricas y no estan tan atadas solamente a reglas, sino al concepto de conocimiento en general (Knowledge).

El Proyecto

Este ejemplo, mediante un proyecto sencillo construido con Maven, se mostraran los primeros pasos para utilizar el framework. Es importante ver el proyecto completo para comprender como interactúan las partes. Y tratar de jugar un poco con el cambiando las reglas y los hechos que se insertan para ver el comportamiento.

Sin mas vamos a ver el proyecto que utiliza Drools. Como en todo proyecto de Drools vamos a tener que incluir las dependencias a los módulos base que vamos a utilizar del proyecto.
Esto, como estamos utilizando Maven, estara descripto en el archivo pom.xml file que describe al proyecto:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.wordpress.salaboy.playing.with.drools</groupId>
 <artifactId>playingWithDrools-ExpertIntroduction</artifactId>
<packaging>jar</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>playingWithDrools-ExpertIntroduction</name>
 <url>http://maven.apache.org</url><repositories>
 <repository>
 <id>repository.jboss.org</id>
 <url>http://repository.jboss.org/maven2</url>
 <snapshots>
 <enabled>false</enabled>
 </snapshots>
 <releases>
 <enabled>true</enabled>
 </releases>
 </repository>
 </repositories>
 <dependencies>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.drools</groupId>
 <artifactId>drools-core</artifactId>
 <version>5.0.0.CR1</version>
 </dependency>
 <dependency>
 <groupId>org.drools</groupId>
 <artifactId>drools-api</artifactId>
 <version>5.0.0.CR1</version>
 <type>jar</type>
 </dependency>
 <dependency>
 <groupId>org.drools</groupId>
 <artifactId>drools-compiler</artifactId>
 <version>5.0.0.CR1</version>
 <type>jar</type>
 </dependency>
 </dependencies>
</project>

Algunos conceptos de Maven

Para aquellos que no estan acostumbrados a Maven es importante notar que:

  • groupId: nos va a decir el grupo donde podremos encontrar nuestro proyecto construido dentro del repositorio de Maven.
  • artifactId: nombre de nuestro proyecto construido.
  • packaging: tipo de empaquetado, en este caso estamos generando un Jar, pero podríamos querer hacer un war, algún otro tipo de proyecto.
  • version: la versión de nuestro proyecto.
  • sección repositories: en esta sección se incluye el repositorio maven2 de JBoss donde estan las ultimas versiones empaquetadas de Drools. Necesitamos tener este repositorio para poder buscar las dependencias y el framework en si.
  • dependencies con groupId org.drools: incluimos las dependencias a las bibliotecas core, api y compiler, ya que son necesarias para la compilación y ejecución de nuestro proyecto que hace uso del framework.

Una vez dicho esto, solo queda bajar el proyecto, descomprimirlo y recorrer su estructura (la estructura refleja un típico proyecto Maven, para un empaquetado de tipo Jar).

Conociendo las APIs básicas

Vamos a analizar el uso mas común de las APIs básicas de Drools, para esto podemos abrir la clase App.java dentro del paquete com.wordpress.salaboy.playing.with.drools, donde encontraremos las siguientes lineas dentro del método main de la clase:


KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newInputStreamResource(new App().getClass().getResourceAsStream("/rules/juego.drl")),ResourceType.DRL);

Con estas dos grandes lineas de codigo, lo que estamos haciendo es mediante un KnowledgeBuilder recaudar todo el conocimiento que vamos a utilizar en nuestra aplicación para luego obtener paquetes de conocimiento ya compilado. Estos paquetes de conocimiento ya compilados se llaman KnowledgeBase, en versiones anteriores llamados RuleBase.

Collection kpkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kpkgs );

Como podemos ver, ya tenemos nuestro conocimiento compilado, ahora contra este conocimiento compilado, que llamamos KnowledgeBase podemos crear sesiones para hacer uso de este conocimiento.

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);

Como vemos, a partir de nuestra base de conocimiento se obtiene una sesion de tipo StatefulKnowledgeSession con la cual vamos a poder interactuar para obtener las deducciones que se generen a partir de nuestro conocimiento.

A continuación solamente creo un logger que nos va a ir indicando los eventos que se van generando dentro de nuestra sesión mientras interactuamos con ella. Este tipo de logger, ConsoleLogger, como su nombre lo aclara, nos mostrara por consola todos los eventos que se vayan generando.

Conclusión

Hasta aquí vimos algunos conceptos básicos de como construir un proyecto que utilice Drools y un preview con una breve explicación de como se ven las APIs que utilizaremos en el día a día si nuestra aplicación utiliza Drools.

En el siguiente post discutiremos el modelo del ejemplo y como se realizaran las ejecuciones de las reglas. Para los ansiosos, el siguiente link tiene el proyecto completo con las reglas y un Main, para probar la ejecucion.

www.jbug.com.ar/external/playingWithDrools-ExpertIntroduction.zip

Pueden bajarlo, jugar y romper tranquilos.

19 thoughts on “Jugando con Drools 5.0 – #1 Drools Expert”

  1. Una pregunta, JEMS es la solución empresarial SOA que ofrece Redhat, pero, ¿es gratuito, o unicamente dispone de un trial de 30 días? Se podría montar un JEMS descargando uno por uno desde la página de JBoss(JBoss ESB, JBPM, Drools, Application Server) e integrarlos en Eclipse? ¿Sería lo mismo?

    Gracias

    Like

  2. Otra pregunta, JBoss ESB irá hacia la implementación del estandar JBI? He leido algo, pero no se ha ciencia cierta si va ha ser así.

    Like

  3. Gracias por tu comentario.
    Por lo que tengo entendido, lo que te vende Red Hat / JBoss es el conjunto de herramientas todas integradas y sobre las cuales obtenes soporte para el uso de las mismas.
    Internamente JBoss tiene distintos branches sobre los cuales se dan soporte de cada uno de los frameworks que podes bajar community. Es la misma relación que hay entre Fedora y RHEL.
    Todo esto, es lo que tengo entendido, prometo averiguar mas al respecto.
    En teoria, si tu bajas todos los frameworks y herramientas y los instalas tu, deberias tener algo similar a lo que ellos te ofrecen, solo que no podrías pedir soporte, porque estarías usando las versiones community. Es bueno aclarar, que lo pago, no es ni mejor ni peor que las cosas community, solo lo tienen controlado ellos para poder dar un soporte correcto.
    Con respecto a JBoss ESB, creo que no es el lugar adecuado para preguntar, yo también habia escuchado lo mismo que vos, pero tampoco de una fuente oficial, ni de ningún miembro del proyecto. Seguramente en los foros de JBoss ESB, en algún canal de chat podras saber hacia donde ira el proyecto.
    Saludos

    Like

  4. Gracias por aclarar las dudas. Seguiré haciendo pruebas con los frameworks que ofrece JBoss en la comunidad y ya me informaré sobre la posible orientación del ESB hacia los JBIs.

    Muchas gracias de nuevo.

    Un saludo.

    Like

  5. De nada, son bienvenidos tus comentarios. Es mas si logras encontrar información valiosa sobre JBoss ESB y su dirección como proyecto, y algún ejemplo de como funciona, o algunas nuevas características te invito a publicarla.
    También aprovecho y te invito a que te sumes a http://www.jbug.com.ar
    Saludos

    Like

  6. Aunque puede que llegue tarde, decir que Jboss ESB es la solución SOA ofrecida por JBoss para permitir intercomunicar de forma standard aplicaciones TI (ERP, CRM, etc) de forma sencilla através de un bus común. Realmente ESB convierte a JBOSS en un contenedor no solo de aplicaciones sino también de servicios ESB. Yo instale JBoss 5.1 y ESB 4.6 y los ejemplos van bien, Todo desde la página de la comuniedad de JBosss.

    Like

  7. Hi,

    I’m new on Drools and I’ve got the following problem with KnowledgeBuilderFactory.

    Look at the following stacktrace:

    GRAVE: Servlet.service() para servlet action lanzó excepción
    java.lang.NoClassDefFoundError: org/drools/builder/KnowledgeBuilderFactory

    thanks in advance 🙂

    Like

  8. buenas tengo la siguiente consulta: es posible modificar las reglas del archivo .drl sin necesidad de tirar y levantar el servidor tomcat? Entiendo que ‘KnowledgeAgent’ permite cargar dinamicamente los cambios pero, esta barriendo cada X tiempo las reglas para detectar cambios… existe algun otra forma? MUCHAS GRACIAS!!!

    Like

  9. Hola como estas?
    Por ahora es el unico comportamiento implementado.
    No existe un mecanismo de push para controlar archivos en el file system implementado en java. Recien en la version de la JDK 1.7 va a estar implementada esa funcionalidad.
    Saludos

    Like

  10. Buenas, como estas? te hago una consulta:
    Estoy teniendo problemas cuando hago el deploy usando tomcat. No me detecta los cambios realizados en las reglas. Sabes como lo puedo solucionar? MUCHAS GRACIAS!

    Like

  11. Buenas como estas?
    No se que problema podras teniendo? tu aplicacion usa drools y es una web application que usa reglas? Donde tenes tus archivos de reglas? como los estas cambiando?
    Saludos

    Like

  12. Buenas, como estas?
    Te hago otra consulta.
    Estoy teniendo un problema cuando hago el deploy en tomcat, no me esta tomando los cambios en las reglas. Sabes como puedo resolverlo?
    MUCHAS GRACIAS!

    Like

  13. Buenas como estas?
    No se que problema podras teniendo? tu aplicacion usa drools y es una web application que usa reglas? Donde tenes tus archivos de reglas? como los estas cambiando?
    Saludos

    Like

  14. Buenas nuevamente, te hago la siguiente consulta:
    Si el compilador del eclipse lo tengo con la JDK1.6, me figura un error en los archivos .drl con la siguiente leyenda: ‘Bad version number in class file’. Estoy usando Drools 5.1 y no sucede lo mismo con las JDK 1.5, estas al tanto de este problema? hay alguna solucion? MUCHAS GRACIAS!

    Like

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.