El propósito de este post es mostrar el uso de task controllers, los beneficios que nos presentan y el comportamiento por defecto que podemos obtener al utilizarlos.

Para mostrar esta funcionalidad utilizo el siguiente ejemplo muy simple de proceso:

Proceso Simple - 1 Task Node - 1 Task

Proceso Simple - 1 Task Node - 1 Task

Donde podemos observar que es un proceso que tiene un solo nodo (aparte del nodo start y end) el cual contiene una tarea definida dentro de el.

La funcionalidad principal de los task controllers es facilitarnos la tarea de la administración de las variables que vamos a utilizar dentro de las tareas que van a realizar personas en nuestro proceso.

Esto quiere decir que tenemos la posibilidad de acotar el espacio de variables que vamos llevando en el proceso a un set mucho mas reducido y especifico de la funcionalidad de una cierta tarea. Y al mismo tiempo copiar el valor, para no modificar la variable del proceso, sino una copia de la misma que puede ser plasmada nuevamente en el proceso cuando la tarea ya este finalizada.

Para hablar un poco mas de la implementación en jBPM, esto que estamos hablando seria realizar una copia de algunas de las variables que se encuentran en ProcessInstance.contextInstance (scope del proceso) a TaskInstance.variables (scope de la tarea).

Mediante esta copia, las tareas pueden realizarse y modificar las variables que estan en su scope, sin molestar a las variables del proceso. También mediante este esquema, se nos permite guardar el estado de estas variables de las tareas mientras se va realizando el trabajo y luego plasmarla cuando la tarea se de por finalizada (que es donde los valores se consideran correctos).

Otra de las utilidades de los task controllers, es la de especificar que variables vera el usuario en el formulario que representara la tarea. Esto quiere decir, que el task controller sirve como puente entre las variables de proceso y el formulario que el usuario vera en la presentación con las variables especificadas en el task controller.

Task Controllers

Task Controllers

Como ultimo detalle para cerrar el comportamiento básico de los task controllers, hace falta aclarar que a cada una de las variables que pasemos del proceso a la tarea se le pueden especificar distintas políticas a tener en cuenta.

Estas políticas son 3:

  • read: realiza una copia de la variable, que puede ser modificada dentro de la tarea, pero cuando se finalice la tarea, no se copiara el nuevo valor a la variable del proceso.
  • write: cuando termine la tarea, el valor modificado dentro de la tarea sera plasmado en la variable del proceso
  • required: obliga al que realiza la tarea a cargar este dato, sino genera una exception

Para demostrar este funcionamiento cree un ejemplo muy básico que consiste en un test de JUnit dentro de un proyecto jBPM creado con GPD en eclipse.

Este ejemplo consiste en el proceso mostrado al comienzo del post y un test que tiene la siguiente funcionalidad:

  • Crea una instancia del proceso
  • Agrega 3 variables al contexto del proceso
  • En el task controller definido dentro de la tarea del task-node se especifica la copia de dos de esas 3 variables con distintas políticas (variable1: con política read,write y variable2: con política solo de read)
  • Se recupera la tarea y se modifican ambas variables
  • Se termina la tarea
  • Se comprueba que una de las dos variables fue plasmada en el proceso y la otra no

Aca les dejo el link al proyecto para que puedan jugar con el:

http://rapidshare.com/files/229438455/TaskControllers.rar.html

(Por favor comenten si el link esta roto asi lo vuelvo a subir y lo actualizo)

Notas sobre el ejemplo:

  • Revisar la definición de la tarea y como se define el task controller
  • Leer los comentarios en el test: com.sample.SimpleProcessTest
  • Debuggear y analizar los objetos dentro del ProcessInstance.contextInstance y taskInstance
  • Genere un formulario dinámicamente para que la tarea se vea en la jbpm-console, pueden analizar los archivos forms.xml y tarea 1.xhtml, pero les recomiendo no utilizar estos formularios
  • Comentar aqui si no quedo algo claro

Saludos! Espero sus comentarios y sus dudas!

27 comentarios para “Jugando con jBPM #16 – Task Controllers”

  1. Mario escribió

    Hola, el link esta roto

    saludos

    Mario

  2. salaboy escribió

    arreglado, gracias por avisar.
    Saludos

  3. Luis Alfredo Narvaez escribió

    Hola Salaboy… excelente post, no lo habia visto… Alguna vez has intentado iniciar un flujo jBPM mediante un webService, o un JMS? Puedes indicarme donde consigo info al respecto?

  4. salaboy escribió

    Totalmente.. es muy comun querer hacer eso…
    Para esto existe el modulo jbpm-enterprise y los Commands. Sobre los cuales deberia escribir un post.
    Gracias por tu comentario!
    Saludos

  5. Luis Alfredo Narvaez escribió

    Hola Salaboy.. estuve mirando los Commands y las colas JMS, y es posible accederlos desde un cliente Java que se pueda conectar al JBoss

    ¿Se podria invocar desde un procedimiento almacenado en Oracle? (PL/SQL) ?

  6. salaboy escribió

    Gracias por tu comentario,
    Probablemente puedas invocarlos desde un store procedure, lo que tienes que preguntarte es si tiene sentido. Ya que suena a como si quisieras ejecutar una acción desde la misma base de datos donde tienes almacenada la información de jBPM y sus procesos.
    Esto si me sonaría extraño. Comentame cual seria la interacción y analizamos juntos como podrías llevarla acabo.
    Saludos.

  7. Luis Alfredo Narvaez escribió

    Salaboy, es que hay una aplicacion en Oracle Forms 6i que debe disparar un proceso jBPM. Entonces una de las maneras que se podría hacer es mediante un database trigger (PL/SQL)

    No se me ocurre de qué otra manera hacerlo (sin tocar el codigo de la aplicacion en Oracle Forms 6i)

  8. salaboy escribió

    En ese caso si, veo que estas realizando una integración bastante importante de productos y tecnologías.
    En tu caso yo te recomendaría que utilices llamadas remotas para invocar commands con jBPM.
    Es decir, ya que Oracle te deja ejecutar procedimientos almacenados en Java, podrias llamar remotamente (RMI, WS, ETC) a servicios de jBPM que se encuentren deployados en un JBoss y asi realizar la interacción.
    Esto suena a lo que quieres hacer?
    Saludos

  9. Juan Carlos escribió

    te felicito por el blog me ha ayudado a entender mas sobre el tema,por si acaso el link del post jbpm#16 task -controllers,esta nuevamente roto (http://rapidshare.com/files/186522799/TaskControllers.rar.html), por favor si pudieras enviarlo por email a cazavill@yahoo.com.gracias de antemano.

  10. Pablo escribió

    Hola,
    el link sigue roto :-)

    Un saludo

  11. salaboy escribió

    Ya esta arreglado.. lamentablemente en rapidshare te permiten 10 descargas del archivo y lo dan de baja cada 90 dias.
    Perdon.
    Saludos!

  12. Javier Muñoz escribió

    Hola,
    En primer lugar, muchas gracias por el blog, ya que hay muchas notas y comentarios sobre JBPM.
    Estoy buscando herramientas que me faciliten la implementación del workflow en mi empresa.
    Estoy recogiendo información de JBPM y BONITA.

    ¿Crees que pueden ser validos para implementar un workflow que pueda tener activos entre 30.000 ó 40.000 instancias? ¿Existe alguna limitación?

    Estas instancias pueden estar activas mucho tiempo, por tanto, entiendo que es necesario la persistencia en base de datos.

    Muchas gracias de antemano y un saludo

  13. salaboy escribió

    Gracias por el comentario.
    Te comento que como tu mismo dices, vas a tener muchas instancias que van a estar activas por mucho tiempo, por lo cual aunque la instancia estara creada no necesariamente estara usando el procesador, sino que estara persistida esperando alguna interacción. Por lo tanto, por el número de instancias activas no debes preocuparte, no hay ninguna limitación sobre esto. Si tienes que tener en cuenta toda la información que esas instancias manejan, ya que dependiendo del caso puede que tengas grandes requerimientos de base de datos.
    Saludos, si tienes mas dudas, no dudes en comentar!

  14. Alberto escribió

    Hola Salaboy y resto de gente.
    Siento molestarles pero el link está roto, ¿podría alguien resubir dichos ejemplos?
    Gracias

  15. salaboy escribió

    Gracias por tu comentario.
    Link Arreglado!
    Saludos

  16. Reiner escribió

    Hola amigos

    Estoy buscabdo como sacar el WorkFlow Histoty List de una instancia de proceso.

    Cualquier ayuda please…

    Saludos

    • salaboy escribió

      Explica un poco mas lo que necesitas hacer?
      Por lo que entiendo de la pregunta estas buscando por que nodos fue pasando el workflow en la aplicacion?
      Cuentame que datos necesitas exactamente.
      Saludos

  17. Reiner escribió

    Hola

    Lo que necesito hacer es traerme la Historia(Bitacora) de un Proceso. Estuve mirando la db y veo un tabla JBPM_LOG que seguro contiene toda esta info, pero puede que ya exista alguna clase que me de el resumen de eso.
    Algo asi como una lista de de los nodos por lo que pasó la instancia del proceso asi como las variables “seteadas” en ese instante..

    Gracias por preguntar.

    reinerra@gmail.com

    • salaboy escribió

      Perfecto, vas a tener que trabajar un rato y comprender como funcionan los niveles de log en jBPM. Para esto te recomiendo ver dos cosas, la primera seria que vieras como crear nuevas named queries y la segunda las configuración de logging que tiene jBPM.
      Saludos

  18. Reiner escribió

    Hola amigo, no hablo de los log de jbpm, ocupo afresco por otro lado que usa a su vez a jbpm …y alfresco tiene una clase que engloba este tema…por eso “creo” que tal vez ya exista “algo”

    • salaboy escribió

      Entonces es un tema totalmente distinto, deberias revisar en los foros de Alfresco sobre el tema. Yo estuve utilizando Alfresco justamente para entender como funcionaba la integración con jBPM y como tu dices hay un set de APIs que engloban todos los servicios que Alfresco posee. Igualmente sigo pensando que vas a tener que ir por el camino de jBPM, ya que la información que estas pidiendo es administrada por este framework.
      Saludos

  19. Reiner escribió

    Gracias
    En todo caso si encuentras los tips please avisame…en cuanto yo lo logré también te aviso.

    Estuve pensando a partir de JBPM_LOG crearme mi taskHistoryList.

    Saludos
    Reiner

  20. mur escribió

    Hola Mauricio,

    Me gustaría integrar JBPM con JBoss ESB. He estado buscando ejemplos pero el resultado a sido negativo. JBPM ya aprenderé con tu blog y ya he realizado varias pruebas con el ESB y han sido positivas, pero, ¿cómo integrar las dos soluciones? ¿Que me puede aportar JBoos Rules (Drools) una vez que integre ESB+JBPM?

    Gracias.

    P.d: No sabía donde escribir la duda y he incluido la pregunta en el último post relacionado con JBPM.

  21. Reiner escribió

    ESB….. revisa, eMule ESB, hace poco hicimos un estudio de los ESB Open Source y eMule..es el top.

Escribe un comentario