miércoles, 3 de julio de 2013


Los desarrolladores de software siempre estamos buscando como volver más ágiles nuestras aplicaciones, ya sea bien por un deseo propio o por los constantes cambios en el negocio. Tener la facilidad de modificar las reglas del negocio sin tener que sacar la aplicación de producción es el deseo de todo arquitecto.

Lo mismo pasa con los desarrolladores BPM que desean que sus procesos utilicen servicios de reglas, en vez de tener que implementarlas dentro del proceso.

Existe una necesidad de externalizar ese desarrollo de las reglas de negocio en sistemas que sean capaces de desplegarlas y ejecutarlas, y es ahí donde interviene WSO2 y su herramienta Business Rule Services o BRS, como la llamaremos a partir de ahora.

Esta herramienta permite desde su UI la implementación de servicios de reglas de negocio pero en esta ocasión quiero mostrarles las potencialidades del Developer Studio de WSO2 para la creación de reglas de negocio.

Precondiciones:
  • Tener eclipse JUNO instalado. Si tiene la versión más actual del STS mejor.
  • Tener el plugin Developer Studio 3.2.0 instalado en el IDE.


Paso 1:
Crear un proyecto “Business Rules Servic Project” usando el Developer Studio Dashboard.



Aquí los pasos son muy sencillos:
  • Le dan a la primera opción para crea un servicio de reglas.
  • Luego definen un nombre para el proyecto y un nombre para el servicio.
  • Y luego Next  y Finish.

En mi caso tengo el siguiente proyecto creado:

Por defecto se les abre el fichero Service.rsl y bueno ya le he puesto algunas cosas así que me luce así. Veremos cada una ahora.




Paso 2:

He añadido una regla que se ve de la siguiente manera:



O sea le he puesto una descripción a la regla y en la opción inline he copiado el siguiente texto:

import aplicacion.rrhh.Empleado; 
      
    rule "Programador" salience 11 dialect "mvel" no-loop true 
        when 
            $empleado : Empleado (promedioConocimientos >= 8 ) 
        then 
               $empleado.setCargo("Programador"); 
               $empleado.setSalario(500); 
    end 
      
    rule "Lider de Proyecto" salience 10 dialect "mvel" no-loop true 
        when 
            $empleado : Empleado (promedioConocimientos >= 6, promedioConocimientos <= 7) 
        then 
               $empleado.setCargo("Lider de Proyecto"); 
               $empleado.setSalario(1000); 
    end 
      
    rule "Analista" salience 9 dialect "mvel" no-loop true 
        when 
            $empleado : Empleado (promedioConocimientos >= 3, promedioConocimientos <= 5) 
        then 
              $empleado.setCargo("Analista"); 
              $empleado.setSalario(2000); 
    end  
      
    rule "Gerente" salience 8 dialect "mvel" no-loop true 
        when 
            $empleado : Empleado (promedioConocimientos >= 0, promedioConocimientos <= 2) 
        then 
            $empleado.setCargo("Gerente"); 
            $empleado.setSalario(3000); 
    end


Veamos la traducción de este texto para aquellos que no dominan el leguaje de Drools:

Supongamos que tenemos una empresa X que quiere automatizar la forma en que le asigna el salario y el cargo a sus trabajadores en dependencia de su nivel de conocimientos. Esta es la forma en que lo hace:
El nivel de conocimientos va desde 0 y hasta más de 8. Mientras más conocimiento más alto el valor.
  • Si el trabajador tiene 8 o más de conocimientos entonces es programador y su salario es de 500.
  • Si el trabajador tiene 6 o 7 de conocimientos entonces es Líder de proyecto y su salario es de 1000.
  • Si el trabajador tiene 3 o hasta 5 de conocimientos entonces es Analista y su salario es de 2000.
  • Si el trabajador tiene 0 o hasta 2 de conocimientos entonces es Gerente y su salario es de 3000.
El servicio debe automatizarnos la asignación del rol y el salario al trabajador cuando le especificamos su nivel de conocimiento. Y eso es lo que aparece en el texto anterior, que se puede leer bastante fácil una vez que se tiene una comprensión de estas reglas para asignar rol y salario.

Ej.:  Esta regla:


    rule "Gerente" salience 8 dialect "mvel" no-loop true 
        when 
            $empleado : Empleado (promedioConocimientos >= 0, promedioConocimientos <= 2) 
        then 
            $empleado.setCargo("Gerente"); 
            $empleado.setSalario(3000); 
    end

Me dice que cuando un empleado tenga el nivel de conocimientos mayor o igual que cero y menos o igual que 2 tendrá el cargo de gerente y su salario será de  3000. Lo mismo se aplica para el resto de las reglas.


Seguimos.!!!!

Paso 3:

Vamos a crear ahora la clase que nos representa a un empleado. Para eso vamos a src/main/java dentro del proyecto, clic derecho y creamos una clase nueva:




Como ven es una clase muy sencilla, con los métodos get/set para cada uno de sus atributos.

Paso 4:

Volvemos al fichero  Service.rsl, a su pestaña de diseño y agregamos una operación nueva:

Para eso dan clic en el botón Add y luego la dejan de esta manera:


En mi caso la entrada es un objeto Empleado y la salida es el mismo objeto actualizado, por eso es que tanto la entrada como la salida se representan con la misma clase.

Y hasta aquí la implementación del servicio, porque ya está implementado. :-D

Ahora debemos desplegarlo en un BRS. En mi caso estaré usando uno local así que me aprovecharé de otras de las funcionalidades del WSO2 Developer Studio y crearé un servidor de WSO2 que me apunte al BRS que tengo.

Paso 5:

Para eso buscan la pestaña de Servers en el Eclipse y crear uno nuevo de la  siguiente manera:

En mi caso ya tenía  uno creado, si ustedes no lo tienen le dan a “Add”


Y ahí deben seleccionar usando el botón Browser la carpeta raíz de su BRS y listo.

El problema ahora es que el proyecto como lo tenemos no se puede desplegar en el BRS, para hacerlo debemos crear una Aplicación CARBON que nos empaquete este proyecto, y lo que desplegamos en el BRS es esta aplicación CARBON, que se encarga a su vez de desplegar el servicio de reglas.

Paso 6:

Para hacer esto volvemos al dashboard del Developer Studio y seleccionamos Carbon Application  Project.
Cuando lo hagan verán como nos lista todos los proyecto de WSO2 que tenemos en el workspace, y debemos seleccionar el de reglas de negocio. en mi caso luce así.

Le asignan un nombre y listo.

Luego es cosa de como cualquier aplicación web en java adicionarla al servidor CARBON que creamos antes y ejecutar el servidor.

Paso 7:

Cuando el servidor se inicie verán unos logs similares a estos:

[2013-07-02 23:33:19,741]  INFO - ApplicationManager Deploying Carbon Application : DespliegueReglaNegocio_1.0.0.car...
[2013-07-02 23:33:20,807]  INFO - ApplicationManager Successfully Deployed Carbon Application : DespliegueReglaNegocio {super-tenant}
[2013-07-02 23:33:36,890]  INFO - DeploymentInterceptor Deploying Axis2 service: SalaryRuleService {super-tenant}
[2013-07-02 23:33:36,949]  INFO - DeploymentEngine Deploying Web service: SalaryRuleService-1.0.0.aar -
[2013-07-02 23:33:42,927]  INFO - CarbonAuthenticationUtil 'admin@carbon.super [-1234]' logged in at [2013-07-02 23:33:42,927-0400]

Como ven nos ha desplegado la aplicación DespliegueReglaNegocio y esta a su vez nos ha desplegado el servicio SalaryRuleService-1.0.0.aar

Paso 8:

Abrimos la consola de administración, buscamos el servicio creado.

Y le damos “Try this Service”

Aquí tienen un pantallazo de la ejecución:

Y así en pocos pasos podemos tener creado un servicio web de reglas de negocio usando Drool y al cual podemos incorporarle todas las potencialidades de la suite de wso2 como son:

  • Múltiples niveles de seguridad para la autenticación y autorización.
  • Cacheo de la información.
  • Filtrado por IP.
  • Clusterización.
  • Transparencia de ubicación.
  • ……

Espero les resulte de utilidad y dejen su comentario.

0 comentarios:

Publicar un comentario