Jugando con jBPM #16 – Task Controllers

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/416151266/TaskControllers.rar

(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!

Advertisements

Published by:

salaboy

Open Source Developer. Author of the jBPM, jBPM5, jBPM6 Developer Guide & Mastering Drools Books. Now Principal Software Engineer @ Alfresco, previously Senior Software Developer @ Red Hat / JBoss.

Categories Java, JBoss JBPM, jbug35 Comments

35 thoughts on “Jugando con jBPM #16 – Task Controllers”

  1. 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?

    Like

  2. 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

    Like

  3. 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) ?

    Like

  4. 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.

    Like

  5. 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)

    Like

  6. 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

    Like

  7. 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

    Like

  8. 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!

    Like

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

    Like

  10. Hola amigos

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

    Cualquier ayuda please…

    Saludos

    Like

    1. 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

      Like

  11. 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

    Like

    1. 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

      Like

  12. 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”

    Like

    1. 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

      Like

  13. 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

    Like

  14. 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.

    Like

  15. Hola Salaboy, buenisimo el blog, te pregunto en esta 16 sesion de jBPM cuales son los metodos para manipular un proceso de jbpm directamente con java, por ejemplo deployar un proceso, generar un instancia, e ir dando las señales para que el proceso avance.

    Saludos

    Like

  16. Hola,soy nuevo en el uso de jbpm,y tengo vrias dudas sobre los task node,mi pregunta es la siguiente si estoy desarrollando un proyecto con Spring y Jbpm,cuando el proceso llegue al node task y este requiera un formulario yo soy el que tengo que proporcionarselo.quisiera saber si JBPM no trae algo para generar autamaticamente los formularios..Cunado desplegamos en el servidor Jbboss el GPD,trae una forma de crear los formularios dinamicamente,pero con Spring y apache tomcat no se como se hace

    Like

  17. Estimado, estoy revisando, pero el link esta roto…justamente estoy estudiando la integracion de jBPM con Alfresco… me puedes dar una orientación exacta de los pasos a seguir??, te lo agradeceria…

    cualquier ayuda me lo puedes comentar al correo dag@microsystem.cl

    Like

  18. Que tal Salaboy!!

    De nuevo muy buen post,gracias por tus aportes.

    Te molesto para pedirte el favor con el link del ejemplo. gracias

    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