viernes, 3 de julio de 2009

Persistencia en MySQL de procesos jBPM

Hemos visto en un artículo anterior (Instalación jBPM en MySQL) cómo instalar jBPM en un entorno formado por un servidor de aplicaciones Jboss y una base de datos MySQL, y hemos desplegado una definición de un proceso simple que vamos a usar para nuestras pruebas.

También hemos visto como ir recorriendo el flujo de ejecución de una instancia de este proceso, aunque lo hemos hecho de forma local. El estado de esta ejecución 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 seguido, si no que haya que en ocasiones se mantendrá en espera de que ocurra algún evento o de que algún actor realice una tarea antes de reanudar la ejecución. Por ello, toda la información relativa a la ejecución del proceso debe persistir en una base de datos de la que poder recuperarla cuando sea preciso.

Para la persistencia en bases de datos, jBPM utiliza Hibernate. Por tanto, lo primero que hemos de hacer es realizar la configuración adecuada para nuestra 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 configuración para las distintas bases de datos soportadas. En nuestro caso, sustituimos el contenido del archivo hibernate.config.xml por el de hibernate.config.mysql.xml. Vamos a hacer un cambio para que no se vuelva a crear el esquema de la base de datos cada vez que se cargue la configuración, que va a ser comentar la línea
<property name="hibernate.hbm2ddl.auto">create</property>

También hay que añadir la librería del conector de MySQL que contiene el driver JDBC a la base de datos.

Una vez hecho esto, veremos cómo se maneja la persistencia en jBPM. Lo primero es cargar la configuración de jBPM, que se guarda en el archivo jbpm.cfg.xml, de la siguiente manera:
// Se carga la configuración 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 permite realizar operaciones adicionales
// sobre los grafos de procesos
GraphSession graphSession = jbpmContext.getGraphSession();
// Busca la última versión 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 podemos revisar la base de datos y comprobar la creación de esta instancia en la tabla JBPM_PROCESSINSTANCE. También podemos 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 ejecución de este proceso.

De esta manera, se ha creado una instancia del proceso simple que está preparada para su ejecución. Para ello, un usuario debería recuperar esta instancia del contexto de la siguiente forma:
// Se carga la configuración 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 versión del proceso simple
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("simple");

// 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 señal a la instancia: "
+ processInstance.getId());
// Se arranca la ejecución de esta instancia
processInstance.signal();
System.out.println("Se ha enviado una señal a la instancia: "
+ processInstance.getId());
} else {
System.out.println("Ya ha terminado la instancia: "
+ processInstance.getId());
}
}

jbpmContext.close();

Con esto hemos visto como usar la persistencia de jBPM para crear una instancia de un proceso y posteriormente recuperar esta instancia y continuar con su ejecución.

Referencias:
jBPM user guide
jBPM Javadoc

No hay comentarios:

Publicar un comentario