Iniciándose en JBPM 6 en simples pasos
Se dice mucho sobre JBPM pero a la vez no se dice nada. La versión estable actual de jBPM (la cual es la 6). También está integrada con Drools, de forma que uno puede integrar el BRMS con un BPM de forma fácil. JBPM 6 soporta BPMN 2.0.
En este post, te mostraré algunos simples pasos para comenzar con JBPM 6.0. Es un ejemplo muy simple de bajo nivel para comprender la API JBPM. El ejemplo incluye la ejecución de una definición de proceso simple con código ejemplo.
Descárgate las librerías de jbpm 6 desde su sitio en Jboss.
Integra el plugin de jbpm en tu Eclipse Juno.
RuntimeManager:
La API de jBPM te permite crear una sesión de manera fácil. Todo lo que tienes que hacer es valerte del gestor de runtime. Se crean sesiones del RuntimeEngine, en las cuales los datos pueden ser insertados y donde las instancias del proceso pueden ser iniciadas. El siguiente trozo de código muestra cómo crear un RuntimeManager consistente de una sola definición de proceso.
RuntimeManager manager = createRuntimeManager("Hola.bpmn");
RuntimeEngine engine = getRuntimeEngine(null);
Knowledge Session:
El siguiente paso es iniciar una sesión para interactuar con la runtime creado. El siguiente trozo de código muestra cuan fácil es crear una sesión basado en el engine anteriormente creado, e iniciar un proceso.
KieSession ksession = engine.getKieSession();
ProcessInstance processInstance = ksession.startProcess("prueba_uno");
Eventos:
La API de JBPM API te permite escuchar algunos eventos durante la ejecución del proceso para interactuar con el runtime JBPM. Se puede usar un ProcessEventListener para escuchar eventos relacionados al proceso, como comenzar o completar un proceso, entrando y dejando un nodo, etc. Puedes asignar tu clase listener usando la siguiente línea de código.
ksession.addEventListener(new EventListenerPrueba());
Parámetros de entrada:
También puedes proporcionar parámetros de entrada para ayudarte a ejecutar tu lógica de negocio mientras que el proceso se esté ejecutando. El siguiente ejemplo de código muestra cómo proporcionar parámetros de entrada a la ejecución de un proceso.
Map inputParams = new HashMap();
inputParams.put("nombre", "soy un parametro de entrada.");
ProcessInstance processInstance = ksession.startProcess("prueba_uno", inputParams);
Puedes accesar a este parámetro durante la ejecución del proceso en tu implementación de event listener.
public class TestEventListener implements ProcessEventListener {
@Override
public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
System.out.println("Antes que el Nodo dispare el evento recibido para el
nodo: " + event.getNodeInstance().getNodeName());
Object obj = event.getNodeInstance().getVariable("nombre");
System.out.println("Parametro de entrada de ProcessInstance: "
+ obj.toString());
}
}
Ahora, pongamos todo junto en una clase de prueba. Se han incluido por comodidad todas las librerías descargadas de jbpm 6 al proyecto en el workspace de mi eclipse.
BPMN 2.0 Process Definition
Lo siguiente es una definición de proceso ejemplo que he usado en mi clase de prueba. Contiene tres nodos: inicial, Hola (Script Task) y nodo final. ScriptTask simplemente imprime algo cuando se ejecuta. El atributo id en la etiqueta Process es usada en el workflow inicial de la sesión. Por comodidad se muestra únicamente lo que se tiene que modelar. Se puede jugar con los atributos de los elementos en la vista Properties.
Modelo del ejemplo y la vista properties
TestEventListener.java
import org.drools.event.process.ProcessCompletedEvent;
import org.drools.event.process.ProcessEventListener;
import org.drools.event.process.ProcessNodeLeftEvent;
import org.drools.event.process.ProcessNodeTriggeredEvent;
import org.drools.event.process.ProcessStartedEvent;
import org.drools.event.process.ProcessVariableChangedEvent;
public class TestEventListener implements ProcessEventListener {
public void beforeNodeLeft(ProcessNodeLeftEvent arg0) {
if(arg0.getNodeInstance().getNodeName()==null){
System.out.println("Antes de dejar el nodo Inicial");
}else{
System.out.println("Antes de dejar el nodo " +
arg0.getNodeInstance().getNodeName());
}
}
@Override
public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
System.out.println("Antes que el Nodo dispare el evento recibido para el
nodo: " + event.getNodeInstance().getNodeName());
Object obj = event.getNodeInstance().getVariable("nombre");
System.out.println("Parametro de entrada de ProcessInstance: "
+ obj.toString());
}
@Override
public void afterNodeLeft(ProcessNodeLeftEvent arg0) {}
@Override
public void afterNodeTriggered(ProcessNodeTriggeredEvent arg0) {}
@Override
public void afterProcessCompleted(ProcessCompletedEvent arg0) {}
@Override
public void afterProcessStarted(ProcessStartedEvent arg0) {}
@Override
public void afterVariableChanged(ProcessVariableChangedEvent arg0) {}
@Override
public void beforeProcessCompleted(ProcessCompletedEvent arg0) {}
@Override
public void beforeProcessStarted(ProcessStartedEvent arg0) {}
@Override
public void beforeVariableChanged(ProcessVariableChangedEvent arg0) {}
}
FirstTest.java
import java.util.HashMap;
import java.util.Map;
import org.jbpm.test.JbpmJUnitBaseTestCase;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.manager.RuntimeManager;
import org.kie.api.runtime.process.ProcessInstance;
@SuppressWarnings("restriction")
public class PrimeraPrueba extends JbpmJUnitBaseTestCase{
@Test
public void testProcess() {
RuntimeManager manager = createRuntimeManager("Hola.bpmn");
RuntimeEngine engine = getRuntimeEngine(null);
KieSession ksession = engine.getKieSession();
ksession.addEventListener(new TestEventListener());
Map inputParams = new HashMap();
inputParams.put("nombre", "soy un parametro de entrada.");
ProcessInstance processInstance = ksession.startProcess("first_test",
inputParams);
// checa si la instancia del proceso se ha terminado con éxito
assertProcessInstanceCompleted(processInstance.getId(), ksession);
assertNodeTriggered(processInstance.getId(), "Hola");
manager.disposeRuntimeEngine(engine);
manager.close();
}
}
Si gustas el proyecto completo siéntete con la confianza de enviarme un email a it.adesales@gmail.com
No olvides regalarnos un like en Facebook como JavaDevelopersMexico.
Saludos cordiales
Abimael Desales López
No hay comentarios:
Publicar un comentario