jueves, 20 de agosto de 2009

Nueva versión del Manual de Introducción a JBoss jBPM 3.x

He actualizado el Manual de Introducción a JBoss jBPM 3.x que estoy creando para incluir los artículos que he publicado en este blog durante las últimas semanas.

Podeis descargarlo desde aquí.

Espero que os sea de utilidad.

Uso de un nodo de correo

En este artículo se muestra un ejemplo de uso de un nodo de correo dentro de un proceso en jBPM.

Para poder probar el funcionamiento del envío de mensajes, lo primero que se va a hacer es instalar un servidor de correo, en este caso, Apache James, un servidor de correo electrónico implementado en Java muy fácil de instalar.

En primer lugar se obtienen los archivos binarios de la última versión (2.3.1) de esta dirección. 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 configuración 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 administración remota del servidor, en la que hay que registrarse como usuario root con el mismo password root. A continuación se crean dos usuarios user y user2 que se van a usar para las pruebas:

En un cliente de correo electrónico, como Thunderbird, se configura la cuenta de correo de electrónico para el usuario user. El password es también user y todos los servidores que se piden son localhost. Así, el usuario user ya puede enviar y recibir correo a través del servidor que hemos instalado.

Para probar esta configuración, se va a crear un proyecto en eclipse, con una clase de prueba que envía un correo electrónico 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");
}
}

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

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 envíe un correo al usuario user, como se ha mostrado en la imagen anterior.

Para probar este proceso se crea una clase de prueba que unicamente crea una instancia del proceso y lanza su ejecución:
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 definición 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 debería recibir un mensaje en el cliente de correo en que se ha configurado la cuenta del usuario user:

Referencias:
JBoss user guide
jBPM Javadoc
Apache James
Working with James

martes, 18 de agosto de 2009

Consola de administración de jBPM (II)

Vamos a mostrar un ejemplo de manejo de un proceso a través de la consola de administración de jBPM. En primer lugar, vamos a crear un proceso con un nodo de inicio (Comenzar proceso), un nodo de tarea (Realizar tarea) y un nodo de fin (Fin proceso):

Configuramos la tarea del nodo de inicio para que se realice la asignación por actor. No definimos ningún 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:

A continuación se despliega el proceso. Una vez desplegado entramos en la consola de administración 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 ejecución de este proceso:

Esto nos ha llevado a la página que nos muestra la información relacionada con la ejecución de proceso que acabamos de lanzar. Si se selecciona Process Image se puede ver la situación actual de esta ejecución:

Como se puede apreciar, esta ejecución todavía se mantiene en el estado inicial. Podemos ir a Personal/Group Tasks para ver las tareas que tiene pendientes el usuario manager:

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

Ahora el usuario manager realizaría las operaciones necesarias para la ejecución de esta tarea. Una vez que se hayan realizado, se pulsaría en End y se vería que la tarea pendiente ha desaparecido de la lista de tareas pendientes del usuario manager.
Ahora podemos ir a Processes y aparecería 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 ejecución en activo de este proceso, se pueden ver las tareas pendientes de esta ejecución:

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 opción Start para esta tarea. Si pinchamos en Process Image, se puede ver la situación actual de esta instancia del proceso:

Vamos a desconectarnos y a volver a registrarnos como usuario user, para realizar la tarea que tiene asignada. Si vamos a la lista de tareas de este usuario:

Ahora se podría realizar esta tarea de la misma manera que hizo antes el usuario manager.

Una vez realizada esta tarea la instancia del proceso pasaría al nodo final y terminaría su ejecución.

lunes, 17 de agosto de 2009

Consola de administración de jBPM

La instalación de jBPM en JBoss incluye una aplicación web de administración de jBPM, llamada jBPM Administration Console, a la que se puede acceder a través de esta URL. Esta aplicación, 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 aplicación requiere registro de usuario. La consola de administración tiene una serie de roles definidos que permiten realizar determinadas categorías:
  • admin: Administrador de la herramienta. Permite la administración de usuarios y procesos (creación y eliminación 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 agrupación relacionada con la seguridad de la aplicación:
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 relación de pertenencia entre cada usuario del grupo del mismo nombre y de todos los usuarios con el grupo user:
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(1,'M',NULL,NULL,1,1);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(2,'M',NULL,NULL,1,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(3,'M',NULL,NULL,2,2);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(4,'M',NULL,NULL,2,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(5,'M',NULL,NULL,3,3);

A partir de este momento ya se puede usar la aplicación.

jueves, 13 de agosto de 2009

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 acción que se ejecuta se puede definir de dos formas:
  • Mediante una expresión beanshell script.
  • A través de una manejador de acción, una clase que implementa la interfaz ActionHandler.

A continuación se va a crear como ejemplo un proceso que contiene un nodo node que utiliza una implementación de ActionHandler para conocer la transición a seguir.

En la siguiente imagen se puede ver el proceso de ejemplo:

Este proceso empieza en un nodo de inicio y 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 automáticamente al siguiente nodo
  executionContext.getProcessInstance().signal();
 }
}

La última línea de esta acción provoca un salto inmediato al siguiente nodo, que en este caso se trata del nodo final fin.

Referencias:
JBoss user guide
jBPM Javadoc

lunes, 10 de agosto de 2009

Manual de introducción a JBoss jBPM

Después de haber escrito varios post sobre JBoss jBPM, me he decidido a juntarlos todos en un único documento a modo de manual de iniciación. En él se trata sobre la instalación de la herramienta y algunos condeptos fundamentales de ella y se muestran algunos ejemplos básicos de su uso.

Podéis descargar el manual de la siguiente dirección:
Manual de introducción a JBoss jBPM

Espero cualquier comentario que tengáis a bien hacer sobre dicho manual, como posibles errores o cosas a mejorar.

JavaPassion

Si hay una persona que siente verdadera pasión por Java, ese es Sang Shin. Se trata de una empleado de Sun que ha creado una serie de cursos online sobre Java y tecnologías relacionadas disponibles de forma totalmente gratuita desde su página web JavaPassion.

Durante los últimos meses he seguido el curso JEE Programming (with Passion!). En él, además de los conceptos básicos de la plataforma JEE, se tratan temas tan de actualidad como Hibernate, JPA, Spring o EJB3, entre otros.

Y si eres una alumno aplicado que realiza todos los ejercicios que se plantean en el curso, puedes obtener tu propio certificado (no oficial). ¡Yo ya tengo el mío!

Os recomiendo que visitéis la página web de Sang Shin y echéis un vistazo a sus cursos, seguro que alguno os resulta interesante.