jueves, mayo 25, 2006

BeanFlow, lightweight workflows de la forma fácil

Utilizar BPEL para resolver workflows es una forma de hacerlo, pero ciertamente no la mas fácil. BeanFlow pretende orquestar eventos encadenando métodos de beans y manteniendo la lógica en ellos.
Lo único que hay que hacer es definir una clase heredada de Workflow con enums (java 5) como posibles pasos del workflow e implementar un método por cada enum.

Ejemplo (de los fuentes de BeanFlow):
package org.apache.servicemix.beanflow;
public class SimpleWorkflow extends Workflow {

public static enum Step {
stepA, stepB, stepC, stop
};

public SimpleWorkflow() {
super(Step.stepA);
}

// Workflow steps
// -------------------------------------------------------------------------
public Step stepA() {
return Step.stepB;
}

public Step stepB() {
return Step.stepC;
}

public Step stepC() {
return Step.stop;
}
}
En este ejemplo, el contructor define que cuando comienza el workflow se inicializa en el paso A (stepA), y en cada uno de los pasos (métodos que comenzan con "step" igual que el enum "Step"), se devuelve el siguiente paso a ejecutar.

Este sencillo workflow puede ser lanzado luego instanciándolo y ejecutando el método "start":
package org.apache.servicemix.beanflow;

import org.apache.servicemix.beanflow.util.ActivityTestSupport;

public class SimpleWorkflowTest extends ActivityTestSupport {

public void testWorkflow() throws Exception {
SimpleWorkflow workflow = new SimpleWorkflow();
workflow.start();

Thread.sleep(2000);

assertStopped(workflow);
}
}
Por supuesto no todo termina allí, ya que BeanFlow provee mecanismos para hacer workflows paralelos, joins, detener worflows iniciados o saber el estado de un workflow.
Y todo en menos de 30 clases.