Você está na página 1de 34

MANUAL DE INTRODUCCIN A JBOSS jBPM 3.

Jorge Roldn Barrio

ndice de contenido
Control de versiones.............................................................................................................................3 1. Introduccin......................................................................................................................................4 2. Instalacin.........................................................................................................................................5 2.1 Instalacin del servidor de aplicaciones JBoss..........................................................................5 2.2 Ejecucin del instalador jBPM..................................................................................................5 2.3 Instalacin de un servidor de base de datos MySQL.................................................................5 2.4 Instalacin del plugin para Eclipse Jboss Tools ........................................................................6 2.5 Comprobacin del conjunto de la instalacin............................................................................6 3. Modelado de procesos en jBPM.......................................................................................................8 3.1 Nodos.........................................................................................................................................8 3.1.1 Nodo de inicio (start).........................................................................................................8 3.1.2 Nodo de tarea (task-node)..................................................................................................8 3.1.3 Nodo de estado (state) .......................................................................................................8 3.1.4 Nodo de decisin (decision)...............................................................................................8 3.1.5 Nodo fork .........................................................................................................................9 3.1.6 Nodo join ...........................................................................................................................9 3.1.7 Nodo node..........................................................................................................................9 3.1.8 Nodo de fin (end)...............................................................................................................9 3.2 Transiciones...............................................................................................................................9 3.3 Acciones ....................................................................................................................................9 4. Ejemplo de proceso simple.............................................................................................................10 5. Persistencia de procesos.................................................................................................................13 6. Uso de un nodo node......................................................................................................................16 7. Uso de un nodo de decisin............................................................................................................17 8. Uso de un nodo de tarea.................................................................................................................20 9. Uso de un nodo de correo...............................................................................................................23 9.1 Instalacin de un servidor de correo Apache James Server..................................................23 9.2 Implementacin del proceso de ejemplo.................................................................................25 10. Consola de administracin de jBPM............................................................................................27 10.1 Registro de usuario en la consola de administracin de jBPM..............................................27 10.2 Ejemplo de uso de la consola de administracin de jBPM....................................................28 Conclusiones.......................................................................................................................................34

Control de versiones
Fecha Autor Observaciones 10/08/09 Jorge Roldn Barrio Versin inicial del documento 13/08/09 Jorge Roldn Barrio - Inclusin del captulo sobre el uso de un nodo node - Reorganizacin de los captulos de uso de los tipos de nodos - Cambio de nombre del documento para resaltar que se hace referencia a la versin 3.x de jBPM 17/08/09 Jorge Roldn Barrio Inclusin del captulo sobre la consola de administracin de jBPM 20/08/09 Jorge Roldn Barrio Inclusin del captulo sobre el uso de un nodo de correo

Manual de introduccin a JBoss jBPM

1. Introduccin
La lgica de negocio se puede definir en forma de una serie de tareas relacionadas que se deben ejecutar, si se cumplen unas determinadas condiciones, de forma secuencial o paralela, o mantenerse en espera de algn evento que reanude su ejecucin. Al conjunto de estas tareas se le conoce como proceso de negocio.La gestin de procesos de negocio (BPM Business Process Management) se encarga del modelado de los procesos de negocio, y define el flujo de trabajo (workflow) que rige su funcionamiento. Un workflow modela de forma grfica las relaciones entre las distintas tareas. Un sistema de gestin de procesos de negocio (BPMS - Business Process Management System) es una aplicacin que gestiona estos flujos de trabajo, y se encarga de automatizar la secuencia de acciones, actividades o tareas que componen del proceso y se encarga de la persistencia de su estado. Esta automatizacin permite integrar los procesos de la empresa y redisearlos de acuerdo a nuevas estrategias. Existen varios sistemas de gestin de procesos de negocio, y uno de ellos es JBoss jBPM, cuya principal ventaja para aquellos que quieren aprender esta tecnologa es que es open-source. En el presente manual se pretende introducir al lector en el uso de esta herramienta.

4 de 34

Manual de introduccin a JBoss jBPM 3.x

2. Instalacin
Antes de empezar a trabajar con jBPM, se va a proceder a la instalacin de dicha herramienta y de un conjunto de utilidades que facilitan el desarrollo jBPM en Eclipse llamadas jBoss Tools. La instalacin comprende los siguientes pasos: Instalacin del servidor de aplicaciones Jboss. Ejecucin del instalador de jBPM. Instalacin de un servidor de base de datos MySQL. Instalacin del plugin para Eclipse Jboss Tools. Comprobacin del conjunto de la instalacin. Es necesaria la instalacin de un JDK en el equipo si es que no se encuentra ya instalado. Durante la realizacin de este manual, se ha a realizado la instalacin en un equipo Windows XP que tiene instalada la versin 1.6.0_04-b12 de la JDK de Sun.

2.1 Instalacin del servidor de aplicaciones JBoss


Se debe descargar la versin 5.0.1.GA del servidor de aplicaciones Jboss de jboss.org. El archivo descargado es un .zip que se debe descomprimir en el directorio que se desee. En este caso, todos los archivos del servidor se van encontrar en la carpeta C:\JBoss\jboss-5.0.1.GA. Haciendo doble clic sobre el archivo C:\JBoss\jboss-5.0.1.GA\bin\run.bat se arranca el servidor con la configuracin por defecto. Se trata de un servidor de aplicaciones completo pero sin funcionalidades de cluster, webservices, etc.

2.2 Ejecucin del instalador jBPM


A continuacin se debe descargar el instalador de jBPM de la direccin sourceforge.net. Seleccionamos el archivo jbpm-installer-3.2.6.SP1.jar. Al ejecutarse este instalador permite instalar la suite de jBPM sobre distintas versiones del servidor de aplicaciones de Jboss y distintas bases de datos como Hypersonic o MySQL. Se ejecuta el instalador de jBPM. Lo primero que pide es la ruta de instalacin, que en este caso va a ser C:\java\jbpm. A continuacin pregunta por los paquetes a instalar, pero lo dejaremos tal y como est y pulsaremos Next. Ahora se debe elegir la versin del servidor en la que estamos realizando la instalacin, despus la base de datos y finalmente la ruta del servidor. Tras esto ya se pasa a realizar la instalacin.

2.3 Instalacin de un servidor de base de datos MySQL


Lo ms sencillo sera realizar la instalacin utilizando la base de datos Hypersonic. Hypersonic es una base de datos que se almacena en memoria, usada para desarrollo. Sin embargo, la informacin almacenada se va a perder cada vez que se pare el servidor. Por ello, en nuestro caso, vamos a realizar la instalacin sobre MySQL. Si no se dispone de un servidor de base de datos MySQL instalado, se descarga de 5 de 34

Manual de introduccin a JBoss jBPM dev.mysql.com/downloads/ el servidor MySQL Community Server y las herramientas de administracin GUI Tools. Una vez descargados se procede a su instalacin. Ahora habra que crear el esquema de base de datos que usa jBPM. Por sencillez, se va a mantener la configuracin por defecto para la fuente de datos que utiliza jBPM. Para hacer que funcione, se debe ir al MySQL Administrator y crear un nuevo catlogo llamado jbpmtest y un nuevo usuario de nombre jbpmtest y sin password. Se asigna a este usuario todos los permisos de la tabla jbpmtest. En la ruta de instalacin de jbpm (C:\java\jbpm) hay, entre otras cosas, scripts de creacin del esquema usado por jBPM. Si se va al MySQL Query Browser y se realiza la conexin al esquema jbpmtest, a travs de File Open Script se puede seleccionar el script para la creacin de las tablas en MySQL, C:\java\jbpm\database\jbpm.jpdl.mysql.sql. Con la ejecucin de este script, se habr finalizado la instalacin de jBPM con MySQL.

2.4 Instalacin del plugin para Eclipse Jboss Tools


Para el desarrollo en jBPM es til contar con una herramienta de modelado grfico que simplifique las cosas. Para ello se va a instalar Jboss Tools, que es un conjunto de herramientas para Eclipse. Entre estas herramientas, Jboss Tools dispone dispone de plugins que proporcionan soporte en Eclipse para Hibernate, JBoss AS, Drools, jBPM, JSF, (X)HTML, Seam, Smooks, JBoss ESB o JBoss Portal, entre otros. Se puede obtener Jboss Tools de la direccin http://www.jboss.org/tools/download.html. Se puede realizar la descarga de forma directa o seguir las instrucciones para realizar la actualizacin desde Eclipse.

2.5 Comprobacin del conjunto de la instalacin


Una vez instalado Jboss Tools, ya se puede crear un proyecto jBPM de ejemplo en Eclipse de la siguiente manera: Ir a File New Project. Desplegar Jboss jBPM y seleccionar Process Project. Introsucir el nombre del proyecto, por ejemplo, simple. Seleccionar la ruta el entorno de ejecucin de Jboss jBPM, que en este caso se encuentra en C:\java\jbpm. Asegurarse de que est habilitado el check para que cree la definicin de proceso de prueba. Por ltimo, pulsar Finish. Con esto se debera haber creado un proyecto de ejemplo que tiene una definicin de un proceso simple en el archivo processdefinition.xml del paquete simple de la carpeta src/main/jpdl. Si el paquete simple estuviese vaco, se pueden recuperar los archivos que se encuentran en la carpeta C:\java\jbpm\examples\src\test\resources\simple y dejarlos en el paquete simple. Si aparece un error en el proyecto que hace referencia a que falta la librera C:\java\jbpm\lib\activation.jar, se debe arreglar yendo al archivo C:\java\jbpm\src\resources\gpd\version.info.xml y eliminando la lnea que hace referencia a esta 6 de 34

Manual de introduccin a JBoss jBPM 3.x librera. Al hacer un clean del proyecto el error debera haber desaparecido. Si se hace doble clic sobre el archivo processdefinition.xml se abrir el jBPM Graphical Process Designer con la descripcin grfica del proceso de ejemplo. El siguiente paso a dar es desplegar esta definicin de proceso en el servidor jBPM para poder trabajar con ella. Para ello hay que ir a la pestaa deployment y revisar los datos en el apartado Deployment Server Settings para que coincidan con los del servidor de aplicaciones, que deber estar arrancado. Pulsando en Deploy Process Archive se realizar el despliegue, se puede comprobar verificando que esta definicin se ha guardado en la tabla JBPM_PROCESSDEFINITION de la base de datos. Ya se dispone del entorno de trabajo configurado y una definicin de proceso desplegada.

7 de 34

Manual de introduccin a JBoss jBPM

3. Modelado de procesos en jBPM


A continuacin se va a describir los elementos que definen un proceso en jBPM. Un proceso est definido a partir de sus nodos, transiciones y acciones. Para representar un proceso en forma grfica, se puede utilizar el jBPM Graphical Process Designer de Jboss Tools.

3.1 Nodos
Definen los pasos que que se tienen que seguir durante la ejecucin de un proceso, y pueden ser de los siguientes tipos: Nodos de inicio y fin Nodo de tarea Nodo de estado Nodo de decisin Nodos fork y join Nodos node

3.1.1 Nodo de inicio (start)


Los nodos de inicio delimitan el comienzo de la ejecucin de un proceso. Un proceso debe tener un nico nodo de inicio. En el nodo de inicio se puede configurar una tarea. Si no se configura esta tarea, el nodo se queda en estado de espera de una seal externa para continuar con la ejecucin del proceso.

3.1.2 Nodo de tarea (task-node)


Representa una o varias tareas que deben ser ejecutadas por una persona. Cuando la ejecucin del proceso llega a un nodo de tarea, se crea una instancia de cada tarea (task) en las listas de tareas de los miembros del proceso. El nodo se quedar en estado de espera hasta que el usuario informe de la realizacin de la tarea.

3.1.3 Nodo de estado (state)


Es un estado de espera que no requiere de la ejecucin de ninguna tarea. Permanece a la espera de una seal que lance la continuacin del proceso.

3.1.4 Nodo de decisin (decision)


Una decisin se puede modelar de dos formas distintas, en funcin de si es el proceso o una entidad externa quien debe tomar la decisin. Si es el propio proceso quien debe tomar la decisin se debe usar un nodo de decisin. Los criterios de la decisin se pueden especificar: Aadiendo condiciones a las transiciones, mediante beanshell scripts que devuelven un 8 de 34

Manual de introduccin a JBoss jBPM 3.x boolean. Los nodos recorreran sus transiciones examinando las condiciones hasta encontrar la primera transicin que cumpla las condiciones. Mediante una clase DecissionHandler que devuelva la transicin a seguir. Si es una entidad externa quien debe tomar la decisin se deberan usar varias transiciones que salgan de un estado de espera. A este estado de espera se le indicar cual es la transicin a seguir cuando se relance la ejecucin del proceso.

3.1.5 Nodo fork


Un nodo fork divide la ejecucin de un proceso en mltiples ejecuciones concurrentes.

3.1.6 Nodo join


Un nodo join recoge todas estas ejecuciones concurrentes antes de continuar con la ejecucin del proceso.

3.1.7 Nodo node


Permite definir el comportamiento del nodo mediante un elemento Action que se ejecuta cuando el proceso llega al nodo.

3.1.8 Nodo de fin (end)


Los nodos de fin delimitan el final de la ejecucin de un proceso. Un proceso puede tener varios nodos de fin, a los que puede llegar en funcin de las condiciones de ejecucin del proceso. Al llegar a cualquiera de ellos finaliza la ejecucin de este flujo.

3.2 Transiciones
Indican el camino a seguir desde un nodo a otro dentro del proceso. Pueden tener condiciones de guarda las restringen.

3.3 Acciones
Una accin se ejecuta cuando ocurren determinados eventos en la ejecucin de un proceso. Principalmente cuando se entra o se sale de un nodo y cuando se toma una transicin. Estas acciones no tienen influencia sobre el flujo de control del proceso.

9 de 34

Manual de introduccin a JBoss jBPM

4. Ejemplo de proceso simple


Una vez realizada la instalacin de la herramienta jBPM y de haber visto los componentes de un proceso de negocio, se va a proceder a presentar un ejemplo de un proceso en jBPM. En el artculo de instalacin de Jboss Tools se cre un proyecto Simple que defina en proceso simple en jBPM. Se va a estudiar este ejemplo para empezar a comprender cmo trabajar con jBPM. En primer lugar hay que ir a la definicin de dicho proceso, que se encuentra en el archivo processdefinition.xml del paquete simple del directorio src/main/jpdl. Al hacer doble clic sobre este archivo se puede ver este proceso modelado de forma grfica 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. Transicin to_state: Transicin que lleva del nodo start al nodo first. Transicin to_end: Transicin que va del nodo first al nodo end. Las dos transiciones tienen asociadas una accin definida a travs del manejador MessageActionHandler:
package com.sample.action; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext;

10 de 34

Manual de introduccin a JBoss jBPM 3.x


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 accin guarda en el contexto de la instancia de proceso la variable 'message', cuyo valor est definido dentro de las propiedades de la accin. Vamos a probar la ejecucin 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 { public void testSimpleProcess() throws Exception {
// Extract a process definition from the processdefinition.xml file.

ProcessDefinition processDefinition = ProcessDefinition. parseXmlResource("simple/processdefinition.xml"); assertNotNull("Definition should not be null", processDefinition);


// Create an instance of the process definition.

ProcessInstance instance = new ProcessInstance(processDefinition); assertEquals( "Instance is in start state", instance.getRootToken().getNode().getName(), "start"); assertNull( "Message variable should not exist yet", instance.getContextInstance().getVariable("message"));
// Move the process instance from its start state to the first state. // The configured action should execute and the appropriate message // should appear in the message process variable.

11 de 34

Manual de introduccin a JBoss jBPM


instance.signal(); assertEquals( "Instance is in first state", instance.getRootToken().getNode().getName(), "first"); assertEquals( "Message variable contains message", instance.getContextInstance().getVariable("message"), "Going to the first state!");
// Move the process instance to the end state. The configured action // should execute again. The message variable contains a new value.

} }

instance.signal(); assertEquals( "Instance is in end state", instance.getRootToken().getNode().getName(), "end"); assertTrue("Instance has ended", instance.hasEnded()); assertEquals( "Message variable is changed", instance.getContextInstance().getVariable("message"), "About to finish!");

Lo primero que hace este mtodo de prueba es leer la definicin del proceso del archivo simple/processdefinition.xml. A continuacin crea un nueva instancia del proceso simple y despus manda una seal a la instancia creada para que pase al primer estado. Por ltimo, se enva otra seal a la instancia para que vaya al estado final y termine la ejecucin del proceso. En este ejemplo se ha visto cmo crear instancias de un proceso a partir de un archivo de definicin de proceso, que puede ser creado de forma grfica. Tambin se ha visto cmo se realiza la ejecucin de un proceso.

12 de 34

Manual de introduccin a JBoss jBPM 3.x

5. Persistencia de procesos
En el apartado anterior se ha visto cmo ir recorriendo el flujo de ejecucin de una instancia de un proceso de forma local. El estado de esta ejecucin se guarda en memoria y cuando esta termina no queda rastro de ella. Sin embargo, lo normal es que un proceso no se ejecute de esta forma, sino que haya ocasiones en que se mantenga a la espera de que ocurra algn evento o de que algn actor realice una tarea antes de reanudar la ejecucin. Por ello, toda la informacin relativa a la ejecucin del proceso debe persistir en una base de datos de la que poder recuperar cuando sea preciso. Para la persistencia en bases de datos, jBPM utiliza Hibernate. Por tanto, lo primero que hay que hacer es realizar la configuracin adecuada para la base de datos en el archivo hibernate.config.xml. Dentro del proyecto que hemos creado, en la carpeta src/main/config se pueden encontrar varios ejemplos de configuracin para las distintas bases de datos soportadas. Hay que sustituir el contenido del archivo hibernate.config.xml por el de hibernate.config.mysql.xml y hacer un cambio para que no se vuelva a crear el esquema de la base de datos cada vez que se cargue la configuracin, que va a ser comentar la lnea:
<property name="hibernate.hbm2ddl.auto">create</property>

Tambin hay que aadir la librera del conector de MySQL que contiene el driver JDBC a la base de datos. Una vez hecho esto, se va a ver cmo se maneja la persistencia en jBPM. Lo primero es cargar la configuracin de jBPM, que se guarda en el archivo jbpm.cfg.xml, de la siguiente manera:
// Se carga la configuracin de jBPM

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

Para poder realizar operaciones de persistencia se debe crear un contexto jBPM:


// Se crea un contexto jBPM

JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

Una vez creado este contexto, se pueden realizar operaciones de persistencia. Cuando se hayan finalizado estas operaciones, se debe cerrar el contexto:
// Se cierra el contexto jBPM

jbpmContext.close();

Como ejemplo vamos a crear una instancia del proceso simple:


// Se obtiene un GraphSession que prmite realizar operaciones adicionales // sobre los grafos de procesos

13 de 34

Manual de introduccin a JBoss jBPM


GraphSession graphSession = jbpmContext.getGraphSession();
// Busca la ltima versin del proceso simple

ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("simple");


// Se crea una nueva instancia del proceso simple

ProcessInstance processInstance = new ProcessInstance(processDefinition);


// Se buscan las instancias del proceso simple

List processInstances = graphSession.findProcessInstances(processDefinition.getId()); for (Object object : processInstances) { processInstance = (ProcessInstance)object;

System.out.println("Se ha creado la instancia: " + processInstance.getId() + " del proceso: " + processDefinition.getName()); }

Ahora se puede revisar la base de datos y comprobar la creacin de esta instancia en la tabla JBPM_PROCESSINSTANCE. Tambin se puede ver en la tabla JBPM_TOKEN el token de ejecucion de esta instancia. En el campo NODE de esta tabla se indica en que nodo del flujo se encuentra la ejecucin de este proceso. De esta manera, se ha creado una instancia del proceso simple que est preparada para su ejecucin. Para ello, un usuario debera recuperar esta instancia del contexto de la siguiente forma:
// Se carga la configuracin de jBPM

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

// Se crea un contexto jBPM

JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

// Se obtiene un GraphSession que permite realizar operaciones adicionales // sobre los grafos de procesos

GraphSession graphSession = jbpmContext.getGraphSession();


// Busca la ltima versin del proceso simple

ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("simple");

14 de 34

Manual de introduccin a JBoss jBPM 3.x


// Se buscan las instancias del proceso simple

List processInstances = graphSession.findProcessInstances(processDefinition.getId()); for (Object object : processInstances) { ProcessInstance processInstance = (ProcessInstance)object;

// Se comprueba si esta instancia ha concluido

if(!processInstance.hasEnded()) { System.out.println( "Se va a enviar una seal a la instancia: " + processInstance.getId());


// Se arranca la ejecucin de esta instancia

processInstance.signal(); System.out.println( "Se ha enviado una seal a la instancia: " + processInstance.getId()); } else { System.out.println( "Ya ha terminado la instancia: " + processInstance.getId()); } }

Con esto se ha visto cmo usar la persistencia de jBPM para crear una instancia de un proceso y posteriormente recuperar esta instancia y continuar con su ejecucin.

15 de 34

Manual de introduccin a JBoss jBPM

6. Uso de un nodo node


Un nodo node permite definir su comportamiento mediante un elemento Action que se ejecuta cuando el proceso llega al nodo. La accin que se ejecuta se puede definir de dos formas: Mediante una expresin bean shell script. A travs de una manejador de accin, una clase que implementa la interfaz ActionHandler. A continuacin se va a crear como ejemplo un proceso que contiene un nodo node que utiliza una implementacin de ActionHandler para conocer la transicin a seguir. En la siguiente imagen se puede ver el proceso de ejemplo:

Este proceso empieza en un nodo de inicio ya pasa a un nodo node donde se realiza la accion definida por la clase Accion que implementa la interfaz ActionHandler:
public class Accion implements ActionHandler { @Override public void execute(ExecutionContext executionContext) throws Exception { System.out.println("Se realiza la accion programada...");
// Se pasa automticamente al siguiente nodo

executionContext.getProcessInstance().signal(); } }

La ltima lnea de esta accin provoca un salto inmediato al siguiente nodo, que en este caso se trata del nodo final fin.

16 de 34

Manual de introduccin a JBoss jBPM 3.x

7. Uso de un nodo de decisin


Un nodo de decisin se usa para modelar un punto en el flujo en que el propio proceso toma una decisin sobre el camino a seguir. Los criterios de la decisin se pueden especificar de las siguientes formas: Aadiendo condiciones a las transiciones o beanshell scripts que devuelven un boolean. Los nodos recorreran sus transiciones examinando las condiciones hasta encontrar la primera transicin que cumpla las condiciones. Mediante una implementacin de la interfaz de DecissionHandler que devuelve la transicin a seguir. A continuacin se va a crear como ejemplo un proceso que contiene un nodo de decisin que utiliza una implementacin de DecissionHandler para conocer la transicin a seguir. En la siguiente imagen se puede ver el proceso de ejemplo:

Este proceso empieza en un nodo de inicio del que se sale mediante la transicin comenzar. Esta transicin tiene una accin crearvalor manejada por la clase ValorAction, que se encarga de introducir en el contexto de ejecucin una variable valor:
public class ValorAction implements ActionHandler { public String valor;

@Override public void execute(ExecutionContext executionContext) throws Exception { executionContext.getContextInstance().setVariable("valor", valor); } }

A continuacin se llega a un nodo de decision manejado por una clase Decisor, que comprueba si en el contexto de ejecucin existe una variable valor con un valor asignado. Si existe esta variable se abandona el nodo por la transicin terminar1 y si no, por la transicin terminar2:
public class Decisor implements DecisionHandler { public Decisor(String info) { super(); }

@Override

17 de 34

Manual de introduccin a JBoss jBPM


public String decide(ExecutionContext executionContext) throws Exception { String valor = (String)executionContext.getContextInstance().getVariable("valor"); if(valor != null) { return "terminar1"; } else { return "terminar2"; } } }

Por ltimo, al llegar a cualquiera de los nodos finales se lanza una accin que muestra en que nodo est terminando la ejecucin del flujo, manejada por la clase MostrarMensajeAction:
public class MostrarMensajeAction implements ActionHandler { public MostrarMensajeAction(String info) { super(); }

@Override public void execute(ExecutionContext executionContext) throws Exception { System.out.println( "Se sale del flujo por el nodo: " + executionContext.getNode().getName()); } }

Se puede ejecutar este proceso mediante una clase de test como esta:
public void testSimpleProcess() throws Exception {
// Extraer la definicion de proceso del archivo processdefinition.xml.

ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("decision/processdefinition.xml"); assertNotNull("La definicion debe no ser nula", processDefinition);


// Create an instance of the process definition.

18 de 34

Manual de introduccin a JBoss jBPM 3.x


ProcessInstance instance = new ProcessInstance(processDefinition); assertEquals( "La instancia est en el estado inicial", instance.getRootToken().getNode().getName(), "inicio"); assertNull( "La variable 'valor' no debe existir todava", instance.getContextInstance().getVariable("valor"));

// Mueve la instancia de proceso desde el estado inicial al primer estado.

instance.signal(); }

Si en la configuracin se ha introducido un valor para la variable valor, por la consola se ver un mensaje que indica que ha terminado en el nodo final1. En caso contrario se termina en el nodo final2.

19 de 34

Manual de introduccin a JBoss jBPM

8. Uso de un nodo de tarea


A continuacin se va a exponer cmo crear tareas en jBPM y asignar qu actor o actores las deben realizar. Esto permite a los actores responsables de su realizacin recoger las tareas pendientes que existan en un determinado momento para completar su ejecucin. En primer lugar vamos a crear una definicin de proceso llamada tarea formada por un nodo inicial, un nodo de tarea y un nodo final: Como ya se ha mencionado anteriormente, un nodo de tarea representa una o varias tareas que deben ser ejecutadas por una persona. Cuando la ejecucin del proceso llega a un nodo de tarea, se crea una instancia de una tarea (task) en la lista de los miembros del workflow. El nodo se quedar en estado de espera hasta que el usuario informe de la realizacin de la tarea. Para crear una tarea en un nodo de tarea, vamos a las propiedades de este nodo. En la tabla de tareas pulsamos el botn derecho del ratn y seleccionamos New Task. Le damos nombre a esta tarea, en este caso algoquehacer y descripcin si queremos. En el apartado Assignment, vemos que hay varias formas de asignar un tarea: Actor: Se le indica el actorId, que es un String que identifica el actor responsable de la tarea. Cuando se crea la tarea al entrar al nodo de tarea, esta tarea pasa inmediatamente a la lista de actividades pendientes de este actor. Pooled Actor: Se le indica una secuencia de actorId separados por comas. Esta tarea al ser creada no es asignada a la lista de ningn actor. Un actor la debe recuperar de la lista de tareas pendientes para el pool de actores y asignarsela para que forme parte de su lista de tareas. Swimlane: Un swimlane o carril sirve para definir una asignacin que es la misma para varias tareas de un proceso. Expression: Se le indica una expresin de asignacin evaluada por el componente de identidad de jBPM. Permite realizar asignaciones en funcin del usuario, grupo o rol. Handler: Se le indica una clase manejadora, que ser la que realice la asignacin de la tarea. Para mantener el ejemplo sencillo vamos a realizar la asignacin de la tarea a un actor, al que vamos a llamar user1:

Despus de desplegar este proceso en el servidor, vamos a realizar una prueba en dos pasos. En el primer paso vamos a crear una instancia de este proceso tarea y a iniciar su ejecucin. Esto es algo que ya hemos visto:
// Se carga la configuracin de jBPM

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

// Se crea un contexto jBPM

20 de 34

Manual de introduccin a JBoss jBPM 3.x


JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

// Se obtiene un GraphSession que permite realizar operaciones adicionales // sobre los grafos de procesos

GraphSession graphSession = jbpmContext.getGraphSession();


// Busca la ltima versin del proceso simple

ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("tarea");


// Se crea una nueva instancia del proceso simple

ProcessInstance processInstance = new ProcessInstance(processDefinition);

// Se pasa al nodo tarea

processInstance.signal();

// Se cierra el contexto jBPM

jbpmContext.close();

Se puede ver en la tabla JBPM_TASKINSTANCES de la base de datos una instancia de la tarea algoquehacer asignada al usuario user1 pendiente de ser ejecutada, es decir, no esta marcada como terminada. Vamos a recuperar los procesos pendientes para el usuario user1 gracias a la clase TaskManagementSession y a informar de la finalizacin de esta tarea:
// Se carga la configuracin de jBPM

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

// Se crea un contexto jBPM

JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

TaskMgmtSession tms = jbpmContext.getTaskMgmtSession(); String actorId = "user1"; List instances = tms.findTaskInstances(actorId); for (TaskInstance taskInstance : instances) { System.out.println( "Tarea pendiente de ejecutar por " + actorId +":"

21 de 34

Manual de introduccin a JBoss jBPM


+ taskInstance.getName() + taskInstance.getId());

// Se informa de la finalizacin de la tarea

taskInstance.end(); }

// Se cierra el contexto jBPM

jbpmContext.close();

Se ha visto como asignar una tarea a un actor y de como recuperar las tareas pendientes de un actor en un proceso posterior para llevar a cabo su ejecucin.

22 de 34

Manual de introduccin a JBoss jBPM 3.x

9. Uso de un nodo de correo


En este artculo se muestra un ejemplo de uso de un nodo node dentro de un proceso. Para poder probar el funcionamiento del envo de mensajes, lo primero que se va a hacer es instalar un servidor de correo.

9.1 Instalacin de un servidor de correo Apache James Server


El servidor Apache James es un servidor de correo electrnico implementado en Java muy fcil de instalar. En primer lugar se obtienen los archivos binarios de la ltima versin (2.3.1) de la direccin http://james.apache.org/download.cgi#Apache%20James%20Server. Se tiene as un archivo comprimido que podemos descomprimir en la ruta que nos plazca. Una vez descomprimido, vamos a la carpeta bin y ejecutamos el archivo run.bat (si estamos en Windows). Con ello se arranca el servidor, apareciendo una pantalla como la siguiente:

Lo siguiente es la configuracin de usuarios de correo. Para ello se abre una ventana de terminal y se ejecuta >telnet localhost 4555. Con ello se accede a la herramienta de administracin remota del servidor, en la que hay que registrarse como usuario root con el mismo password root. A continuacin se crean dos usuarios user y user2 que se van a usar para las pruebas:

En un cliente de correo electrnico, como Thunderbird, se configura la cuenta de correo de 23 de 34

Manual de introduccin a JBoss jBPM electrnico para el usuario user. El password es tambin user y todos los servidores que se piden son localhost. As, el usuario user ya puede enviar y recibir correo a travs del servidor que hemos instalado. Para probar esta configuracin, se va a crear un proyecto en eclipse, con una clase de prueba que enva un correo electrnico del usuario user2 al usuario user:
import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class MailClient extends Authenticator { protected String from; protected Session session; protected PasswordAuthentication authentication; public MailClient(String user, String host) { this(user, host, false); } public MailClient(String user, String host, boolean debug) { from = user + '@' + host; authentication = new PasswordAuthentication(user, user); Properties props = new Properties(); props.put("mail.user", user); props.put("mail.host", host); props.put("mail.debug", debug ? "true" : "false"); props.put("mail.store.protocol", "pop3"); props.put("mail.transport.protocol", "smtp"); session = Session.getInstance(props, this); } public void sendMessage( String to, String subject, String content) throws MessagingException { System.out.println("SENDING message from " + from + " to " + to); System.out.println(); MimeMessage msg = new MimeMessage(session); msg.addRecipients(Message.RecipientType.TO, to); msg.setSubject(subject); msg.setText(content); Transport.send(msg); } public static void main(String[] args) throws Exception { MailClient user2Client = new MailClient("user2", "localhost"); user2Client.sendMessage( "user@localhost", "Prueba", "Mensaje de prueba");

24 de 34

Manual de introduccin a JBoss jBPM 3.x


} }

Ahora, al ejecutar esta clase de ejemplo, se debera recibir un mensaje en el cliente de correo en que se ha configurado la cuenta del usuario user:

9.2 Implementacin del proceso de ejemplo


Una vez configurado el servidor de correo, se va a crear un proceso de prueba, formado por un nodo de inicio, un nodo de correo y un nodo de fin:

Se configura el nodo de correo para que enve un correo al usuario user, como se ha mostrado en la imagen anterior. 25 de 34

Manual de introduccin a JBoss jBPM Para probar este proceso se crea una clase de prueba que nicamente crea una instancia del proceso y lanza su ejecucin:
package com.sample; import junit.framework.TestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; public class ProcessTest extends TestCase { public void testProcess() throws Exception { // Obtener la definicin del proceso ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("nodocorreo/processdefinition.xml"); // Crear una instancia del proceso ProcessInstance instance = new ProcessInstance(processDefinition); // Saltar desde el nodo de inicio instance.signal(); } }

Si se ejecuta esta prueba, se debera recibir un mensaje en el cliente de correo en que se ha configurado la cuenta del usuario user:

26 de 34

Manual de introduccin a JBoss jBPM 3.x

10. Consola de administracin de jBPM


La instalacin de jBPM en JBoss incluye una aplicacin web de administracin de jBPM, llamada jBPM Administration Console, a la que se puede acceder a travs de la URL http://localhost:8080/jbpm-console. Esta aplicacin, implementada en JSF, permite controlar grupos, usuarios, procesos, tareas y trabajos(jobs). Antes de empezar a trabajar con ella, en primer lugar hay que crear varias entidades, puesto que esta aplicacin requiere registro de usuario.

10.1 Registro de usuario en la consola de administracin de jBPM


La consola de administracin tiene una serie de roles definidos que permiten realizar determinadas categoras: admin: Administrador de la herramienta. Permite la administracin de usuarios y procesos (creacin y eliminacin de los mismos). manager: Gestor de procesos y tareas. Permite desplegar y arrancar procesos y reasignar tareas. user: Usuario de la herramienta. Solamente podr realizar las tareas que se le hayan asignado. Para cada estos roles se va a crear un grupo con el mismo nombre, de tipo security-role, que indica que se trata de una agrupacin relacionada con la seguridad de la aplicacin:
INSERT INTO JBPM_ID_GROUP VALUES(1,'G','admin','security-role',NULL); INSERT INTO JBPM_ID_GROUP VALUES(2,'G','manager','security-role',NULL); INSERT INTO JBPM_ID_GROUP VALUES(3,'G','user','security-role',NULL);

Para cada estos grupos se crea un usuario con el mismo nombre:


INSERT INTO JBPM_ID_USER VALUES(1,'U','admin','admin@sample.domain','admin'); INSERT INTO JBPM_ID_USER VALUES(2,'U','manager','manager@sample.domain','manager'); INSERT INTO JBPM_ID_USER VALUES(3,'U','user','user@sample.domain','user');

Se establece una relacin de pertenencia entre cada usuario del grupo del mismo nombre y de todos los usuarios con el grupo user:
INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO JBPM_ID_MEMBERSHIP JBPM_ID_MEMBERSHIP JBPM_ID_MEMBERSHIP JBPM_ID_MEMBERSHIP JBPM_ID_MEMBERSHIP VALUES(1,'M',NULL,NULL,1,1); VALUES(2,'M',NULL,NULL,1,3); VALUES(3,'M',NULL,NULL,2,2); VALUES(4,'M',NULL,NULL,2,3); VALUES(5,'M',NULL,NULL,3,3);

A partir de este momento ya se puede usar la aplicacin.

27 de 34

Manual de introduccin a JBoss jBPM

10.2 Ejemplo de uso de la consola de administracin de jBPM


Ahora se va a mostrar un ejemplo de manejo de un proceso a travs de la consola de administracin de jBPM. En primer lugar, se crea un proceso con un nodo de inicio (Comenzar proceso), un nodo de tarea (Realizar tarea) y un nodo de fin (Fin proceso):

Se configura la tarea del nodo de inicio para que se realice la asignacin por actor. No se define ningn actor, puesto ser el actor que inicie el proceso al que se asignar esta tarea:

Se crea una tarea en el nodo de tarea y se asigna al actor user:

28 de 34

Manual de introduccin a JBoss jBPM 3.x

A continuacin se despliega el proceso. Una vez desplegado se entra en la consola de administracin como usuario manager. Dentro del apartado de procesos se mostrar una lista de los procesos desplegados:

Pulsando en Start dentro del proceso asignaciontareas se lanzar una nueva ejecucin de este proceso:

29 de 34

Manual de introduccin a JBoss jBPM

Esto ha llevado a la pgina que muestra la informacin relacionada con la ejecucin de proceso que se acaba de lanzar. Si se selecciona Process Image se puede ver la situacin actual de esta ejecucin:

Como se puede apreciar, esta ejecucin todava se mantiene en el estado inicial. Se puede ir a Personal/Group Tasks para ver las tareas que tiene pendientes el usuario manager:

30 de 34

Manual de introduccin a JBoss jBPM 3.x

El usuario manager tiene asignada la tarea de comenzar el proceso. Para comenzar la realizacin de esta tarea, se pincha en Start:

Ahora el usuario manager realizara las operaciones necesarias para la ejecucin de esta tarea. Una vez que se hayan realizado, se pulsa en End y se ve que la tarea pendiente ha desaparecido de la lista de tareas pendientes del usuario manager. Yendo a Processes aparecera de nuevo la lista de procesos desplegados. Pinchando en Examine sobre el proceso desplegado, se pueden ver las ejecuciones en activo de este proceso:

Pinchando en Examine sobre la ejecucin en activo de este proceso, se pueden ver las tareas pendientes de esta ejecucin:

31 de 34

Manual de introduccin a JBoss jBPM

Se aprecia que existe una tarea pendiente asignada al usuario user. El usuario manager tiene permisos para ejecutar cualquier tarea en nombre de otro usuario, por eso aparece la opcin Start para esta tarea. Si pinchamos en Process Image, se puede ver la situacin actual de esta instancia del proceso:

Hay que desconectarse y a volver a registrarse como usuario user para realizar la tarea que tiene asignada. Si vamos a la lista de tareas de este usuario:

32 de 34

Manual de introduccin a JBoss jBPM 3.x

Ahora se podra realizar esta tarea de la misma manera que hizo antes el usuario manager. Una vez realizada esta tarea la instancia del proceso pasara al nodo final y terminara su ejecucin.

33 de 34

Manual de introduccin a JBoss jBPM

Conclusiones
El presente manual est siendo realizado durante el aprendizaje de la herramienta jBPM. No es ms que la compilacin de los pequeos artculos que estoy escribiendo en mi blog (http://tratandodeentenderlo.blogspot.com). Estoy tratando de plasmar en ellos la experiencia adquirida durante el aprendizaje de jBPM, aunque mi intencin es escribir sobre otros temas de inters, tambin relacionados con el mundo Java. Aunque este manual contiene suficiente informacin para ayudar a los usuarios inexpertos en su introduccin a jBPM, es mi intencin seguir amplindolo. Para ello agradecera que todo aquel lector que tenga alguna duda o sugerencia sobre el material presentado en este documento me la hiciese llegar por correo electrnico (jorge.roldan@gmail.com) o como comentarios a travs de mi blog.

34 de 34

Você também pode gostar