Jugando con jBPM #14 – TaskMGMT API

En este post vamos a ver un poco de la API para la administración de tareas en jBPM, la cual es muy útil a la hora consultar las tareas que se van creando a medida que nuestra ejecución del proceso va pasando por los diferentes Task Nodes que tengamos definidos.

En este caso, y para este ejemplo, cree el siguiente proceso básicamente compuesto por Task Nodes:

Proceso Ejemplo
Proceso Ejemplo

Como vemos en la imagen, una vez que el proceso comience se creara una tarea contenida dentro del task node “Elegir Tarea del Dia”. Como por defecto las tareas que van a ser realizadas por personas se comportan como Wait States (Estados de espera), nos bloquean la ejecución del proceso. Por lo tanto el comportamiento del proceso sera el siguiente:

1) Se comienza la ejecución del mismo desde el nodo Start (mediante la llamada al método signal)

2) La ejecución del proceso llega hasta el task node llamado “Elegir Tarea del Dia”, crea las instancias de las tareas que estan especificadas dentro del task node (crea objetos TaskInstance).

3) Se persisten los cambios y las instancias de las tareas que se crearon en el schema de jBPM, para esperar la interacción del usuario.

Cuando el usuario quiere interactuar con la tarea que fue creada para el debe ir a buscar en su lista de tareas, donde encontrara todas las TaskInstances que fueron creadas por procesos para el.

Una vez que encontramos la tarea que queremos comenzar en la lista de tareas, deberíamos seleccionarla, completar los datos y luego finalizarla para que el proceso continúe su ejecución.

En esta caso, para el ejemplo decidi que la tarea dentro del task node “Elegir Tarea del Dia”, tuviera como requerida una variable que se llama “tarea” que le va a indicar al proceso porque rama continuar su ejecucion usando el valor de esta variable para decidir en el nodo decisión.

Vamos a ver un poco el código asi se van aclarando las cosas, para esto les cuento un poco el contexto donde estoy ejecutando el siguiente bloque de código:


context=conf.createJbpmContext();
// Obtenemos a partir del contexto una sesion del administrador de tareas, esta nos dara acceso a todas las tareas
// creadas en todos los procesos y asignadas al usuario salaboy.
// Tambien podriamos haber utilizado la instancia del proceso para acceder a una API mas enfocada a la instancia
// del proceso.
List<TaskInstance> tasksForSalaboy=context.getTaskMgmtSession().findTaskInstances("salaboy");

// Itereamos sobre la lista de tareas para el usuario Salaboy
// de esta manera deberiamos armar la UI
for(TaskInstance ti : tasksForSalaboy){
System.out.println("TaskInstance ID: "+ti.getId()+" - Name: "+ti.getName()+ " - Creada: " +ti.getCreate());

}
if(tasksForSalaboy.size() > 0){

TaskInstance elegirTarea=tasksForSalaboy.get(0);

System.out.println("Encontre una tarea = "+elegirTarea.getName());
// Deberiamos comprobar que es la tarea de elegir tarea
// Lo podemos hacer revisando el nombre de la tarea con elegirTarea.getName()
elegirTarea.start();
//Comprobamos que no tenga seteada nada la variable
assertNull(elegirTarea.getVariable("tarea"));
System.out.println("la variable TAREA tiene el valor = "+elegirTarea.getVariable("tarea"));
// Le asignamos el valor lavar a la variable tarea, cocinar nunca antes morir!
elegirTarea.setVariable("tarea", "lavar");
System.out.println("la variable TAREA tiene el valor = "+elegirTarea.getVariable("tarea"));

assertEquals("lavar",elegirTarea.getVariable("tarea"));
//Terminamos la tarea

elegirTarea.end();

}

context.close();

Hay que tener en cuenta que para ejecutar este bloque de código tenemos que tener una instancia de JbpmConfiguration (la variable conf) que debe estar correctamente configurada para comunicarse con nuestra fuente de datos que contiene el schema de jBPM (esta configuración se realiza en el archivo hibernate.cfg.xml).

Creo que el codigo se explica por si solo y los comentarios ayudan en caso de que no se entienda alguna linea en particular. Como se que si no ven el proyecto entero se complica terminar de entender el ejemplo, subi el proyecto entero (pesa 45k) a rapidshare para que pueda verlo. Aca les dejo el link:

(Actualizado)

http://rapidshare.com/files/416067568/jBPMTaskMGMTExample.zip

Algunas Notas sobre el Ejemplo:

1) Uso postgreSQL como base de datos, por lo tanto necesitaran el driver JDBC de postgreSQL (el cual pueden descargar de aca: http://jdbc.postgresql.org/download.html, revisar bien la version que necesiten)

2) En este ejemplo la configuración realizada en hibernate.cfg.xml es para un cliente standalone y no para el framework deployado en un Servidor de Aplicaciones como JBoss. En el caso de estar dentro de una aplicación que esta corriendo sobre JBoss habría que configurar un DataSource y no la conexión directa por JDBC.

3) El ejemplo esta creado con eclipse y el plug in de jBPM, no es como acostumbro a trabajar pero para las personas que estan comenzando me parece un buen punto de partida. (Ver post anteriores para ver como configurar el plug in de jBPM en eclipse/ También llamado designer )

4) Toda la funcionalidad del proyecto se encuentra en una clase que utiliza JUnit para realizar las pruebas de funcionalidad. Buscar en la sección de Tests (scr/test/java/com/sample/SimpleProcessTest.java). Estas pruebas no estan muy prolijas por cuestiones de tiempo.

5) Si el link de rapidshare se cae, por favor avisar asi lo vuelvo a subir.

Les dejo el link de la documentacion oficial donde se habla bastante sobre las tareas:

http://docs.jboss.org/jbpm/v3/userguide/taskmanagement.html

Es importantísima!!!!!!! la sección que se llama: “11.2.2. Task instances and graph execution”

Saludos, espero que sirva de ayuda para entender el uso muy basico de la API, en un post futuro prometo escribir un post sobre la API mas en profundidad.

Cualquier duda sobre la documentacion oficial o sobre este post, no duden en comentar!!!

Advertisements

46 thoughts on “Jugando con jBPM #14 – TaskMGMT API”

  1. Que buen post me ayudaste mucho con el problema que tenia y estuvo buenisima tu idea de subir el archivo… por que en verdad que hace un poco dificil sobre todo si estas comenzando como yo… muy buen post.. voy a pobrar el ejemplo como dijiste …

    Gracias por la ayuda

    Like

  2. Siempre ando con lo de jBPM, pero para escribir aca por lo general me falta inspiracion, si alguno tiene problemas con algun tema en particular, solo basta con comentar y seguramente puedo hacer un post.
    Saludos

    Like

  3. Hola, tengo una consulta, dentro de todos los post, este es el que más se parecía a mi pregunta, así que lo hago aquí:

    Estoy en un TaskNode, donde creo tareas dinamicamente, le asigno actores, y luego quiero persistir (save) la instancia del proceso, y unas lineas despues en el JbpmContext.close() aparece la exception:

    ERROR DbPersistenceService : hibernate commit failed
    org.hibernate.TransientObjectException: object references an unsaved transient instance – save the transient instance before flushing: org.jbpm.graph.def.Node

    Probe hacer save de la instancia del proceso, de las instancias de las tasks del token, pero no logro solucionarlo, al hacer el close, salta la exception.
    A que objeto se refiere que falta persistir? tendre algo mal en jbpm.cfg.xml?
    La verdad que hace 2 dias que estoy trabado con este error.
    Muchas gracias!

    Like

  4. Gracias por tu comentario.
    Respondiendo a tu pregunta, por lo general cuando te cruzas con una exception de tipo TransientObjectException, es porque estas tratando de persistir algo que no es persistente. Lo que me hace pensar que por alguna razon estas metiendo una variable al contexto de tipo Object (es decir, no es de tipo primitivo – int, long, etc) la cual no tienes mapeada en hibernate. Tendras que revisar esto, de manera que tendras que asegurarte que todas las variables en el contexto de tu tarea y en el contexto de tu proceso sean persistentes.
    Saludos, espero tus comentarios con cualquier consulta que tengas.

    Like

  5. Hola!, comente todas las variables, y probe hacer lo mismo en el un save y close en el primer nodo que es wait-state, y sucede lo mismo. 😦

    Pero ya que lo comentas, si quiero setear una variable en el contexto de mi proceso, y luego que se persista, donde deberia mapearla? Hasta ahora yo estoy usando los hbm.xml de hibernate, tal como vinieron, sin agregar nada

    muchas gracias de nuevo!!!

    Like

  6. Habría que ver tu caso particular, para mapear nuevas entidades tienes que crear los archivos hbm y luego agregar los mapeos en el archivo hibernate.cfg.xml.

    Para resolver tu problema habría que revisar el archivo hibernate.cfg.xml y el archivo jbpm.cfg.xml, asi también podrías debugguear para saber que objetos estas guardando en el ContextInstance.
    Saludos.

    Like

  7. Hola, Salaboy,
    conoces algun proyecto para bajar, donde haya algun ejemplo con configuración y codigo, donde se persista un proceso?
    La verdad estoy muy trabado con esto (calculo q es un problema de configuracion), y estoy a punto de descartar JBPM para este proyecto, dada la poca cantidad de ejemplos o documentacion que existe.

    Muchas gracias por toda la ayuda!

    Like

  8. El problema que estas teniendo es muy básico. Por lo general con la documentación oficial y los ejemplos que pueden encontrar cuando te bajas el código de jBPM debería alcanzarte. Si quieres que lo revise puedes enviarme el proyecto a mi mail personal por ahí yo con una simple mirada puedo solucionarte el problema.
    Saludos

    Like

  9. Hola Salaboy, llegue a tu blog mientras buscaba tutoriales de JBPM, empece hace poco y articulos como el tuyo son una gran ayuda.

    saludos!

    Like

  10. Hola escribo de nuevo para preguntar sobre el ejemplo que subiste, perdon si es una pregunta tonta pero para que se necesita postgresql, de cualquier forma yo tengo instalado mysql y estoy trabajando con el plugin de jbpm para eclipse y voy a chekar el ejemplo que subiste.

    Mencionas que no acostumbras a usar eclipse, entonces por lo general en donde haces todo esto?? yo si estoy utilizando eclipse y me pierdo un poco con las explicaciones que haces en tus post.

    saludos

    Like

  11. Los enlaces para descargar el código de RapidShare están rotos. Si pudieras enviarno por correo todos los ejemplos de jBPM estaríamos muy agradecidos.

    Un saludo. Felix.

    Like

  12. Hola salaboy,
    estoy intentando bajarme el enlace de rapidshare y me dice que se ha alcanzado el limite máximo. ¿Puedes volver a subirlo?
    Muchas Gracias de antemano

    Un saludo. Álvaro

    Like

  13. Hola salaboy,
    Por correo te pregunté algunas dudas sobre representar procesos y voy a postear aquí la respuesta para que todos la puedan consultar.

    En la documentacion oficial hay una pequeña nota que te puede guiar. Tampoco hay tantos detalles sobre el tema.

    http://docs.jboss.com/jbpm/v3.2/userguide/html/processmodelling.html#processcomposition

    Está muy buena la solución que me planteas pero no se ajusta a mi necesidad puesto que de esta forma el proceso padre volvería a ejecutarse una vez se termine de ejecutar el proceso hijo. En el caso mío yo no tengo procesos anidados, sino que se ejecuta un proceso y cuando termina de ejecutarse se ejecuta el siguiente, es como una cadena.

    ¿Como me sugieres que podría implementarlo en el jBPM?

    Gracias

    Like

  14. Gracias por postear la respuesta aqui.
    Con la solucion que te proponen en la documentacion oficial consigues exactamente lo que andas buscando.
    Es decir vas a representar un proceso de negocio donde sus nodos/actividades van a representar sub procesos.
    Cuando uno de estos nodos sea alcanzado por la ejecucion del proceso, se creara el sub proceso, se ejecutara por completo y cuando se termine continuara por el proceso padre con la siguiente actividad en la cadena.
    Espero que sea clara la respuesta.
    Si tu necesidad no es urgente, en unas semanas podre postear un ejemplo sobre esto.
    Saludos

    Like

  15. Muchas gracias por la respuesta, creo que ahora si entendí. Es una pena que no postees nada sobre esto hasta dentro de algún tiempo, yo tengo que empezar a trabajar con eso desde ya.

    Muchas gracias.

    Like

  16. El tema es bastante sencillo cuando lo pongas en practica lo notaras. Tampoco creo que pueda hacer un post sobre eso porque no hay mucho contenido. Si tienes alguna situacion un poco mas amplia por ahi podria apurarme.
    Saludos

    Like

  17. Una última pregunta, cada proceso lo diseño en archivos diferentes y luego los voy llamando, sería mas o menos esa la idea?

    Like

  18. Exactamente. Pero no llamas a los procesos por nombre de archivo, sino por Id de proceso. El cual tiene que estar desplegado en la Base de datos de jBPM.
    Entonces terminas teniendo una definicion de proceso por xml y luego despliegas todas donde en el padre tienes la relacion con los hijos por medio de id (que es el string del nombre del proceso).
    Saludos.
    No molestan tus preguntas.

    Like

  19. Muchísimas gracias por tus respuestas, he satisfecho todas las dudas que tenía hasta el momento, ojalá en todos los sitios de internet se encontraran soluciones tan rápidas y tan buenas.

    Saludos.

    Like

  20. Gracias por tus comentarios. Cualquier duda, te estare esperando por estos lados.
    Siempre la idea es ayudar a la comunidad de habla hispana sobre este y otros frameworks.
    Saludos

    Like

  21. Hola salaboy.
    Tengo una nueva duda con jBPM y es que una vez tenga en esta herramienta el flujo de actividades de qué forma cargaría las interfaces de usuario. Me explico mejor, si tengo una actividad que lo que hace es permitir la captación de datos de personas, cómo llamaría la interfaz de usuario para permitir la entrada de datos.

    Saludos

    Like

  22. Gracias por tu nuevo comentario.
    La pregunta, es respondida con el contenido de este post.
    La idea es que en tus aplicaciones, ya sean web, stand alone, o de cualquier tipo tu puedas vincular tus pantallas de cargas de datos con las listas de tareas de las personas que interactuan con los procesos. Para esto es necesario comprender bien como funcionan las apis que te van a permitir extraer toda la informacion necesaria para armar tu capa de presentacion (pantallas en tus front ends).
    Se entendio la respuesta?
    Saludos

    Like

  23. Si, ya entendí que para cargar las pantallas tengo que asociar la pantalla a una tarea específica del usuario y cuando el usuario ejecute la tarea entonces se mostrará dicha pantalla(ejemplo:formulario de entrada de datos). ¿Sabes de algún sitio donde ejemplifiquen esto de cargar una pantalla específica una vez ejecutada una tarea?

    Porque en el ejemplo del post muestras el listado de tareas del usuario pero yo necesito más que eso.

    Una vez más muchas gracias.

    Like

  24. Si revisas bien el codigo veras que al final obtiene la primer tarea de la lista de tareas y realiza esta interaccion.
    if(tasksForSalaboy.size() > 0){
    TaskInstance elegirTarea=tasksForSalaboy.get(0);
    elegirTarea.start();
    elegirTarea.setVariable(”tarea”, “lavar”);
    elegirTarea.end();
    }

    Con estas lineas de codigo tu realizas la tarea que se encontro para dicho usuario. Por lo tanto si tu creas una pantalla para que el usuario interactue, tendras que presentarle formularios al usuario que permitan ingresar los datos necesarios para cada tarea y luego permitirle al usuario que de por terminada una tarea ejecutando el metodo end(). Lo mas normal es tener un boton de finalizar en el formulario que representa a dicha tarea.
    Saludos

    Like

  25. Lo prometido es deuda, dije que lo postearía y aquí está:

    Hola Mauricio.

    Te escribo a tu cuenta para preguntarte una duda pero te aseguro que la voy a postear en tu sitio para que esté disponible para todos los usuarios en Internet. Te adjunto un flujo de procesos (ficticio para tener una idea) y además el flujo de actividades por cada uno de los procesos. La duda que tengo es la siguiente:

    1- En el proceso de registro tengo que mantener el process-state para llamar al proceso de clasificación o simplemente llevaría el Start-end y en el caso de que se tenga que poner este último cómo es que llamo entonces al proceso de clasificación? Lo mismo pasa en el proceso de clasificación.

    Saludos.

    El link para la descarga es: http://rapidshare.com/files/220808326/procesos.rar.html

    Like

  26. La respuesta de salaboy:
    Por lo que veo vas bastante bien..
    Todos tus procesos, tanto el padre como los hijos deben llevar nodos start y end.
    Cuando los sub procesos lleguen al nodo end, le devolveran el control de la ejecucion al proceso padre, continuando asi la ejecucion del mismo.
    No vi un proceso padre en tus ejemplos.. deberias modelarlo con 3 super states y un node decision.
    Saludos.

    Like

  27. Hola salaboy.

    Sabes de algún lugar donde haya ejemplos de flujos desarrollados en jbpm realizado desde principio a fin, que incluya persistencia de las tareas, etc? Porque de esa forma nos podríamos ir guiando y no tendríamos que estar preguntando tantas cosas, bastaría con consultar el ejemplo completo.

    Gracias.

    Like

  28. Tranquilamente podria hacer uno, pero esto no serviria porque cada caso en particular tiene sus propias complicaciones. Lo mejor es aprender la teoria de como funciona el framework y luego usarlo.
    Por eso mis post estan separados por temas.
    Saludos.
    Tampoco me molestan los comentarios.

    Like

  29. Hola a tod@s:

    En primera gracias por el post y por compartir tus conocimientos en la Internet,

    Segundo, los links que tienen tus codigos no sirven, estan rotos, puedes volver a publicarlos por favor?

    saludos.

    Like

  30. Hola estoy empezando en este mundo de los workflow,y realmente tu blog es de lo mejor que he encontrado
    te escribo para ver si puedes subir nuevamente el codigo
    pq el enlace esta roto
    saludos yasiel

    Like

    1. El ejemplo y el link están andando.
      Fíjate el error que te aparece. Si es sobre que no hay suficientes slots para los usuarios de tu pais tendrás que intentar en otro momento.
      Saludos

      Like

  31. Para los ejemplos por lo general la versión 3.2.6.SP1 te va a funcionar perfecto. Hasta ahora nunca probé mucho la versión 4, ya que estoy con Drools Flow ahora.
    Con respecto a JBoss, puede usar la versión que quieras, seguro que hay algunos cambios de configuración, pero no creo que sean complicados.
    Saludos

    Like

  32. Hola. Excelente blog!! Felicitaciones.

    Quisiera pedirte el favor de ativar nuevamente el link del ejemplo o si pudieras subirlo a 4shared el cual tiene mayor permanencia de archivos.

    De nuevo gracias por compartir tus notas de jbpm.

    Like

  33. Hola, tengo una duda acerca del trabajo con subprocesos, es posible desde un subproceso llamar a otro subproceso, es decir, puedo trabajar con subprocesos anidados?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s