Archivo

Archivo para Febrero, 2009

jBPM + Reflection

Lunes, 16 de Febrero de 2009

hello

Categories: jBPM Tags: , , ,

Tomando decisiones en jBPM

Lunes, 9 de Febrero de 2009

Voy a publicar un ejemplo para ver como funcionan los nodos de decisión.

La estructura va a ser igual que en el ejemplo anterior… de hecho he copiado el ejemplo anterior y le he cambiado el workflow y un par de cosas en la clase Start.java.

basico2

Vamos a definir un workflow que decida por ti si ir al cine o ver la televisión en casa (muy util como podeis ver).

Empezaremos tirando un dado y dependiendo del resultado, si es mayor que 3 nos quedaremos en casa viendo la televisión y en caso contrario nos iremos al cine.

El nodo “Tirar dado” será el que nos simule el dado y su salida le permitira al workflow decidir mediante una expresión que veremos más adelante.

basicodecisionEl codigo fuente para este workflow es el siguiente:

<?xml version=”1.0″ encoding=”UTF-8″?>

<process-definition  xmlns=”urn:jbpm.org:jpdl-3.3″  name=”Decision”>

<start-state name=”Inicio”>
<transition to=”Tirar dado”></transition>
</start-state>

<node name=”Tirar dado”>
<action name=”Tirar Dado” class=”basico.action.MessageActionHandler”>
<dado>
0
</dado>
<message>
Tirando el dado
</message>
</action>
<transition to=”decision”></transition>
</node>

<decision name=”decision” expression=”#{ (contextInstance.variables['dado'] gt 3 ? ‘to Ver Television’ : ‘to Ir al Cine’) }”>
<transition to=”Ver Television” name=”to Ver Television”></transition>
<transition to=”Ir al Cine” name=”to Ir al Cine”></transition>
</decision>

<node name=”Ver Television”>
<action name=”Ver Television” class=”basico.action.MessageActionHandler”>
<message>Veo Television</message>
</action>
<transition to=”end-state1″></transition>
</node>

<node name=”Ir al Cine”>
<action name=”Ir al Cine” class=”basico.action.MessageActionHandler”>
<message>Voy al cine</message>
</action>
<transition to=”end-state1″></transition>
</node>

<end-state name=”end-state1″></end-state>

</process-definition>

Las dos cosas importantes de este ejemplo básico las he puesto en negrita. En primer lugar definimos donde se encuentra la función que va a hacer de dado :  class=”basico.action.MessageActionHandler”.

Aquí pongo la clase:

package basico.action;

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;

public class MessageActionHandler implements ActionHandler {

private static final long serialVersionUID = 1L;

String message;
int dado;

public void execute(ExecutionContext context) throws Exception {
context.getContextInstance().setVariable(“message”, message);
System.out.println(message);
if (context.getNode().getName().equals(“Tirar dado”))
{
dado = random(1,6);
System.out.println(“El dado cae rodando por la mesa y sale un “+ dado);
context.setVariable(“dado”, dado);
}

}
private int random(int max,int min){
return (int)(Math.random()*(max-min))+min;
}

Básicamente hay un handler para todas las acciones del workflow, para todos los nodos simplemente sacaremos por pantalla un mensaje con la funcionalidad del nodo, pero si estamos en el nodo “Tirar dado”, además aplicaremos una función random que nos simulará un dado de 6 caras.

El resultado lo guardamos en la variable dado, y ésta la guardaremos en el contexto del workflow para tenerla disponible posteriormente cuando evaluemos la expresión de la decisión.

Una vez tirado el dado, nos toca decidir :

<decision name=”decision” expression=”#{ (contextInstance.variables['dado'] gt 3 ? ‘to Ver Television’ : ‘to Ir al Cine’) }”>

El lenguaje utilizado en “expression” se denomia Expression Lenguage y podeis encontrar una pequeña ayuda sobre este aqui :

http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html

Para acceder a la variable dado, lo hacemos mediante la expresión contextInstance.variables['dado']. Es la forma más cómoda que he encotrado, sin embargo si a alguien se le ocurre otras maneras, por favor, escribidlas en un comentario :)

Finalmente el resultado de todo esto es lo siguiente :

Tirando el dado
El dado cae rodando por la mesa y sale un 3
Voy al cine

Tirando el dado
El dado cae rodando por la mesa y sale un 5
Veo Television

Ahora os podeis bajar el código del ejemplo aqui



Categories: Informática Tags: , ,