martes, 7 de julio de 2009

Asignación de tareas en jBPM

En este artículo vamos a ver cómo crear tareas en jBPM y asignar que actor o actores deben realizarlas. Esto permite a los actores responsables de su realización recoger las tareas pendientes que existan en un determinado momento para completar su ejecución.

En primer lugar vamos a crear una definición de proceso llamada tarea formada por un nodo inicial, un nodo de tarea y un nodo final:

Como se dijo en un post anterior (Modelado de procesos en jBPM): “el nodo de tarea representa una o varias tareas que deben ser ejecutadas por una persona. Cuando la ejecución 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 realización 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 botón derecho del ratón y seleccionamos New Task. Le damos nombre a esta tarea, en este caso algoquehacer y descripción 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 ningún 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 asignación que es la misma para varias tareas de un proceso.

  • Expression: Se le indica una expresión de asignación evaluada por el componente de identidad de jBPM. Permite realizar asignaciones en función del usuario, grupo o rol.

  • Handler: Se le indica una clase manejadora, que será la que realice la asignación de la tarea.

Para mantener el ejemplo sencillo vamos a realizar la asignación de la tarea a un actor, al que vamos a llamar user1:

Después 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 ejecución. Esto es algo que ya hemos visto:
// 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("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 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 finalización de esta tarea:
// Se carga la configuración 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 + " : " + taskInstance.getName() + taskInstance.getId());

// Se informa de la finalización 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 ejecución.

Referencias:
JBoss user guide
jBPM Javadoc

No hay comentarios:

Publicar un comentario