Jugando con jBPM #3 – Proceso Ejemplo + Algunos Conceptos

La idea de este post es presentar un ejemplo de proceso de negocio que nos clarifique la idea del modelado y de las situaciones que comunmente se modelan con jBPM. Para esto se presenta el siguiente proceso de negocio simplificado para el cual se tratara de explicar el comportamiento y la lógica relacionada con cada uno de sus nodos.

Extracción ATM: (traducido seria, retirar dinero de un cajero automático)

Extracción ATM
Extracción ATM

Como vemos en la imagen, en el proceso se describen varios nodos, de distintos tipos que nos permiten especificar un comportamiento particular para cada uno de ellos.

La primer gran diferencia, debido a la cantidad de nodos de tipo tarea y nodos de tipo node, es entre las actividades (o tareas) que son realizadas por personas, y las actividades que realizan sistemas automaticos o procedimientos programados (programas, software, etc).

Por lo tanto es fundamental identificar que actividades las realizan personas y que actividades las realizan sistemas. En este caso de dominio es bastante fácil identificar esta división, pero hay casos donde los dominios son complejos y el lenguaje de dominio también, donde un analista o el encargado de modelado puede llegar a confundirse. En estos casos, es importantísimo profundizar el relevamiento y obtener estos datos, para poder modelar correctamente el proceso.

Esta diferencia entre Tareas y Nodos es importante a nivel jBPM debido a que su comportamiento interno es muy distinto, y por lo tanto nuestro proceso a nivel global se comportara distinto si modelamos un nodo como Tarea o como Nodo (de tipo Node).

Para poder demarcar bien las diferencias de comportamiento veamos las siguientes definiciones simplificadas:

Nodos de Tipo Tarea: van a representar a un actor (persona, ser humano) interactuando con el proceso. Al tratarse de una persona y su interacción con el proceso, fácilmente salta a la vista que el comportamiento del nodo va a ser diferente debido a que una persona no se comporta como una llamada a un método (WebService, función, etc). Sino que el comportamiento y la interacción de la persona con el proceso se caracteriza por ser mucho mas asíncrona. Esto quiere decir, que el “proceso” deberá quedarse esperando (estado conocido como wait state) a que el actor interactúe con el proceso hasta el momento en que el mismo o algún procedimiento que el active cierre (termine formalmente) la tarea.

Nodos de Tipo Nodo: son los nodos mas genéricos, que nos permiten especificar cualquier tipo de lógica y comportamiento dentro de ellos. Nosotros podríamos crear dentro de estos nodos lógica asíncrona o síncrona, pero lo mas normal es que estos nodos sean utilizados para interactuar con lógica de carácter síncrono, como seria la ejecución de un método o la llamada a un Web Service.

Estos dos tipos de nodos, al ser tan distintos utilizan distintas “porciones” de las API que nos provee jBPM. El nodo tipo Tarea hace uso de una sección particular de las API que esta totalmente dedicada a la interacción y administración de todo lo relacionado con las tareas humanas. Muy probablemente escriba un post sobre esto en los siguientes días.

Por el lado del nodo del tipo Nodo, tenemos que tener en cuenta que nos deja especificarle una acción (action handler) que contiene código Java a ejecutar. Dentro de este Action Handler podemos hacer cualquier tipo de llamada a cualquier sistema externo, lo que causara que el proceso se mantenga en el nodo mientras este “código” se ejecuta.

Con respecto al nodo Tipo Decisión no creo que haga falta aclarar mucho, solamente que hay que recordar que esta decisión se puede tomar automáticamente mediante el uso de un Decisión Handler (codigo Java) o a partir de expresiones que evaluen los datos particulares del proceso y en base a eso se decida por donde continuar la ejecucion.

Entonces para ejemplificar un poco vamos a ver el proceso que veiamos en la imagen anterior.

Veamos particularmente el primer nodo (luego del nodo start – al cual le dedicare otro post), el nodo “Ingresar Tarjeta”, este nodo es de tipo Task (tarea) ya que es una actividad que va a realizar una persona cuando se encuentre frente al cajero. Cuando pasara esto? no sabemos. Lo que si sabemos es que en algún momento esto va a ocurrir y por eso el “motor” de procesos se encargo de crear una tarea, que tiene que ser llevada a cabo para que el proceso pueda continuar. Simplemente la lógica de esta tarea seria mostrarle una pantalla al usuario de que debe ingresar la tarjeta en la ranura correspondiente y cuando el usuario ingrese la tarjeta y el lector de la tarjeta recupere el numero y los datos correspondientes de la misma, la tarea finalice y continúe el flujo de ejecución del proceso al siguiente nodo.

En el siguiente nodo, llamado “Reconocer Tarjeta”, es de tipo Node y acá deberíamos tener escrito en Java (dentro de un Action Handler) la lógica para ir a una fuente de datos y recuperar todos los datos asociados a esa tarjeta. Esto seria ir a una base de datos directamente y buscar los datos del duenio de la tarjeta mediante el numero recuperado en la tarea anterior, o consumir un Web Service externo al proceso que realice esta funcionalidad.

Espero haber sido claro y haber dejado un poco marcada la diferencia entre estos dos grandes tipos de nodos. Estaría bueno que si alguien tiene alguna duda sobre algun otro nodo, o sobre que logica deberia llevar asociada algun nodo e particular, lo comente y discutamos sobre eso.

Saludos y espero que sirva de algo…

Advertisements

9 thoughts on “Jugando con jBPM #3 – Proceso Ejemplo + Algunos Conceptos”

  1. con este post ya me quedo muy claro la diferencia entre uno y otro nodo, pero ahora me surge una entre el tipo de nodo decision, y el fork, no hacen casi lo mismo??, lo que yo entiendo es que sirven para que el proceso tome otro camino…

    Like

  2. Creo que el nodo decision se basa en una variable para tomar uno u otro camino y el nodo fork sigue todos los caminos que tenga, es decir, que si de un nodo fork salen tres caminos se seguiran los tres caminos, pero que lo confirme alguien más.
    Por cierto muy bueno el blog, estoy aprendiendo jbpm para diseñar flujos de facturación en una empresa, y esta página me está ayudando bastante. Espero poder aportar algo.

    Like

  3. Exactamente como dice Rodrigo, el decision Node elige solamente una rama por la cual continuar, basandose en el valor de alguna variable del proceso. En cambio el fork Node tiene la funcionalidad de ejecutar varias ramas concurrentemente (es decir, en paralelo). Hoy mismo trato de hacer un post que tenga la comparativa entre estos dos nodos asi pueden comentar ahi si hay dudas mayores. El tema de las ramas concurrentes por ahi es muy dificil de ver sin algun buen ejemplo. Por esto voy a tratar de ser lo mas claro posible. Lamentablemente, muy pocas veces lo logro 😉

    Like

  4. Hola, no se si esta duda corresponderia por aqui. Tengo una definición de proceso en la que en el nodo inicial creo una variable de instancia para utilizarla como identificador ya que se pueden crear varias instancias del proceso para el mismo usuario. A continuación, se crea una tarea para el usuario. Mi duda es como puedo recuperar de la base de datos la tarea sabiendo el identificador. Hasta ahora obtengo todas las tareas de ese usuario y las recorro comprobando si el identificador corresponde con el de la tarea.

    Like

  5. Esa es una posibilidad, la otra podría ser crear un named query (en el archivo hibernate.queries.hbm.xml) que te resuelva esa situación, actualmente hay varios metodos que pueden llegar a servirte:

    TaskMgmtSession.findTaskInstancesByProcessInstance
    TaskMgmtSession.findOpenTasksOfProcessInstance

    Con respecto al identificador que estas usando para identificar al proceso, de que tipo es? podrías directamente usar el id del proceso y no molestarte en mantener una variable mas y tener que crear queries para este identificador.

    Si no te alcanzan esos metodos que mencione mas arriba, vas a tener que crear tus propios named queries y llamarlos con la API obteniendo la session de Hibernate.
    Cualquier duda consultame!
    Saludos

    Like

  6. Hola, el identificador es un string que me pasan de otra parte de la aplicación, por eso empleo este en vez de el id.

    Voy a mirar si puedo hacerlo del otro modo que me comentas.

    Muchas gracias.

    Like

  7. Reciba un cordial saludo.
    Le escribo por que estoy haciendo pruebas con JBPM, y de verdad que todo ha ido bien hasta el momento.
    Su blog me ha ayudado mucho a entender muchas cosas, y bueno acudo a usted precisamente por eso.
    Tenía una aplicación ya funcionando y la cambié a JBPM sin problemas.
    Pero quisiera saber si tienes material sobre el manejo de transacciones, ya que me pasó que hubo una excepción en uno de los nodos, y en el nodo anterior se hacía un registro en la BD. La aplicación antes manejaba las transacciones con Hibernate directamente, quisiera saber que tengo que hacer para que JBPM también lo haga.
    Agradezco su colaboración, y ojalá pueda ayudarme.
    Gracias!!!

    Like

  8. Hola de nuevo Salaboy, parece que me voy animando a escribir aunque sólo sea para pedir cosas… xD
    Estos ejemplos son muy ilustrativos, pero lo serían más si con ellos se adjuntara parte o quizá todo el código en el que deben ser transformados; de esa manera puedes comprender mejor la definición, e irte haciendo a la idea del código generado.

    ¿¿¿Podrías subir dicho código o decirme dónde puedo hacerme con él???
    Muchas gracias por todo y perdón por las molestias

    Like

  9. Gracias por tu comentario.
    Basicamente en este post no agregue el codigo, debido a que es demasiado extenso y se haria bastante complicado mostralo.
    No hay nada extranio en el ejemplo, si tienes GPD instalado, basta con que copies los nodos que hay en el ejemplo y tendras exactamente lo que yo realize. Ahi podras ver el codigo generado. Recuerda que lo que se ve en el ejemplo es a nivel demostrativo y no funcional, luego tu tendras que implementar todos los detalles tecnicos para que un ejemplo de este tipo pueda correr en algun ambiente de ejecucion.
    Espero aclarar tus dudas, si tienes alguna duda mas concreta, porfavor pregunta.
    Saludos

    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