jueves, 2 de julio de 2009

Ejemplo de un proceso sencillo en jBPM

En el artículo de instalación de Jboss Tools (Instalación de JBoss Tools) se creó un proyecto Simple que definía en proceso simple en jBPM. Tambien en un artículo anterior (Modelado de processos en jBPM) hemos visto los elementos que permiten definir un proceso. Teniendo estos dos artículos en cuenta vamos a echar un vistazo al proceso simple.

En primer lugar vamos a ir a la definición de dicho proceso, que se encuentra en el archivo processdefinition.xml del paquete simple del directorio src/main/jpdl. Si hacemos doble clic sobre este archivo se vemos este proceso modelado de forma gráfica en el jBPM Graphical Process Designer:



El proceso simple está compuesto de tres nodos y dos transiciones:
  • Nodo start: Nodo inicial.
  • Nodo first: Nodo intermedio de estado.
  • Nodo end: Nodo final del proceso.
  • Transición to_state: Transición que lleva del nodo start al nodo first.
  • Transición to_end: Transición que va del nodo first al nodo end.
Las dos transiciones tienen asociadas una acción definida a través del manejador MessageActionHandler:
package com.sample.action;

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

public class MessageActionHandler implements ActionHandler {

private static final long serialVersionUID = 1L;

/**
* The message member gets its value from the configuration in the
* processdefinition. The value is injected directly by the engine.
*/
String message;

/**
* A message process variable is assigned the value of the message
* member. The process variable is created if it doesn't exist yet.
*/
public void execute(ExecutionContext context) throws Exception {
context.getContextInstance().setVariable("message", message);
}
}

Esta accion guarda en el contexto de la instancia de proceso la variable 'message', cuyo valor está definido dentro de las propiedades de la acción.

Vamos a probar la ejecución de este proceso mediante la clase de test SimpleProcessTest:
package com.sample;

import junit.framework.TestCase;

import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class SimpleProcessTest extends TestCase {

/**
* Método de test que pasa por todas las tareas del proceso 'simple'.
*/
public void testSimpleProcess() throws Exception {
...
}
}

Lo primero que hace este método es leer la definición del proceso del archivo simple/processdefinition.xml:
// Extraer la definicion de proceso del archivo processdefinition.xml.
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("simple/processdefinition.xml");
assertNotNull("La definicion debe no ser nula", processDefinition);

A continuación crea un nueva instancia del proceso simple:
// Create an instance of the process definition.
ProcessInstance instance = new ProcessInstance(processDefinition);
assertEquals(
"La instancia está en el estado inicial",
instance.getRootToken().getNode().getName(),
"start");
assertNull(
"La variable 'message' no debe existir todavía",
instance.getContextInstance().getVariable("message"));

Después manda una señal a la instancia creada para que pase al primer estado:
// Mueve la instancia de proceso desde el estado inicial al primer estado.
// Se debe ejecutar la acción configurada y debe aparecer el mensaje
// apropiado en la variable de proceso message.
instance.signal();
assertEquals(
"La instancia está en el primer estado",
instance.getRootToken().getNode().getName(),
"first");
assertEquals(
"La variable 'message' contiene el mensaje",
instance.getContextInstance().getVariable("message"),
"¡Va al primer estado!");

Por último, se envía otra señal a la instancia para que vaya al estado final y termine la ejecución del proceso:
// Mueve la instancia de proceso al estado final. Se debe ejecutar de
// nuevo la acción configurada. El mensaje contiene un nuevo valor.
instance.signal();
assertEquals(
"La instancia está en el estado final",
instance.getRootToken().getNode().getName(),
"end");
assertTrue("La instancia ha terminado", instance.hasEnded());
assertEquals(
"La variable 'message' ha cambiado",
instance.getContextInstance().getVariable("message"),
"About to finish!");

Hemos visto como crear instancias de un proceso a partir de un archivo de definición de proceso, que puede ser creado de forma gráfica. También hemos visto como se realiza la ejecución del proceso.

No se ha tratado la persistencia en la base de datos de la información del proceso. En el próximo artículo veremos como persistir la información de ejecución de un proceso en la base de datos.

2 comentarios:

  1. Hola, me parecio de mucha ayuda tu post, y necesito probar un ejemplo rapido de jbpm, queria probar tu ejemplo pero el link esta caido. Me seria de mucha ayuda si me lo podes mandar o volverlo a subir. muchas gracias. Joaco

    joaco_33@yahoo.com

    ResponderEliminar
  2. Hola Joaco,

    ¿A qué link te refieres? En este artículo lo único que se muestra es el código de un ejemplo que puedes desarrollar en tu propio Eclipse.

    Un saludo.

    ResponderEliminar