Los bucles o iteraciones se pueden categorízar en dos tipos principales, bucles estándar y multiinstanciados, estos últimos en paralelo o en secuencia. La serie de procesos que vamos a desarrollar a partir de aquí son ejemplos de tarea de instancia múltiple en paralelo.
El objeto del proceso es lanzar una propuesta de compra que han de verificar y dar el visto bueno tres personas diferentes. No obstante, para una mejor comprensión, antes de llegar a ese objetivo iremos probando diferentes versiones hasta completar el proceso.
En este caso, solo queremos ver que, efectivamente, la tarea aprobar genera 3 instancias antes de terminar el proceso.
El formulario de instanciación es la solicitud de compra en sí. Tendremos que introducir un artículo a comprar, la cantidad de unidades y el precio por unidad.
En cuanto enviemos el formulario inicial veremos en el portal de adiministración las 3 tareas pendientes. El porqué 3 y no otro número lo explicaremos más adelante. De momento, nos vale con saber que el número de instancias viene determinado, en este proceso en particular, por una lista de identificadores de usuario, y esa lista contiene 3 identificadores.
En cada una de las 3 instancias se lanza el mismo formulario, simplemente responder verdadero o falso (true, false).
Como ya hemos dicho, esta primera versión es muy limitada, lo cierto es que no hacemos nada con esos votos o vistos buenos, eso lo dejamos para versiones posteriores. Ahora mismo solo podemos ver los datos introducidos en el formulario de instanciación.
Al dibujar el diagrama no te preocupes por el símbolo de iteración —las 3 barras verticales en la tarea aprobar—, aparecerá después. Para tener claro con qué diagrama estamos trabajando, sobre todo de cara a la exportación e importación, vamos cambiar el nombre a
el diagrama: MultiParalelo - versión 0.9
el pool: MultiParalelo - versión 0.9
OrdenCompra
articulo - STRING
cantidad - INTEGER
precio - INTEGER
aprobado - BOOLEAN
afavor - INTEGER
encontra - INTEGER
En esta versión solo vamos a utilizar unos cuantos atributos, más adelante se entenderá el motivo por el que incluimos los demás.
vncompra -- com.company.model.OrdenCompra
supervisores
Esta variable es la que va a determinar cuántas instancias de "aprobar" se van a generar.
Puesto que la idea final es que sean tres usuarios de la organización Acme los que ejecuten sus propios vistos buenos —aunque todavía no lo hemos implementado—, esta variable debe ser de tipo LONG y múltiple. En Bonita, los identificadores de usuario son números de ese tipo (entero largo). Que sea múltiple quiere decir que no es un dato escalar sino una lista de identificadores.
En el momento de la instanciación del proceso queremos que la variable se inicialice a unos usuarios concretos. Eso lo conseguimos editando el "valor predeterminado".
Vamos a crear un script Groovy muy simple. El nombre puede ser cualquiera, nosotros hemos elegido init_supervisores(). El cuerpo del script devuelve directamente una lista de tres elementos:
return [5L, 6L, 7L]
Para asegurar que son números de tipo LONG, añadimos el sufijo "L" a cada número. Ten en cuenta que estamos diciendo que los usuarios con ese número serán los encargados de dar sus correspondientes vistos buenos a la compra.
Puesto que es una lista, el tipo de retorno ha de ser java.util.List.
Recuerda que en esta versión no vamos a hacer uso realmente de esos identificadores, solo estamos obligando a la tarea a instanciarse 3 veces, sin hacer caso de los valores concretos de esta lista.
Agregando desde datos, vamos a seleccionar estos atributos, añadiendo una descripción a cada ítem.
vncompraInput -- COMPLEX -- La solicitud de compra
articulo -- TEXT -- Escribe cualquier texto
cantidad -- INTEGER -- Introduce un número entero
precio -- INTEGER -- Introduce un número entero (€)
En esta tarea es donde vamos definir las iteraciones a partir de la lista supervisores.
Definiremos el tipo de iteración seleccionándolo de la lista disponible en la pestaña dispuesta para ello.
Lo primero es elegir el tipo "multiinstancia paralela". Eso nos abre el resto de opciones.
Vamos a crear las instancias a partir de la lista supervisores antes creada. Nos aparecerá en el desplegable y la seleccionaremos. A continuación, se crea automáticamente el iterador multiInstanceIterator —al que podríamos cambiar el nombre si quisiéramos—. De momento no vamos a hacer nada con él. También al seleccionar la lista supervisores el sistema detecta que se trata de una lista de enteros largos (java.lang.Long).
Dejamos el resto de opciones vacías para versiones posteriores del proceso.
Es importante darse cuenta de que cada instancia de la tarea, como si fuera una tarea normal, necesita un contrato, un formulario y unas operaciones —es una tarea de intervención humana—. La diferencia con otros proceso que hemos desarrollado, es que esos objetos, definidos aquí una sola vez, se van a usar varias veces, tantas como instancias de la tarea se generen.
Dicho de otra forma, cada vez que se invoque a la tarea nos tiene que mostrar su formulario y, quien sea, debe rellenarlo.
Como estamos en una versión muy preliminar, solo definimos contrato, y ni tan siquiera desde una variable de negocio, con una variable nueva definida en el momento. Tampoco vamos a hacer uso de ella en esta versión.
Como se ha explicado al principio de esta página, al ejecutar verás el formulario de instanciación y, después, en el portal de administración te tienen que aparecer tres tareas por "tomar". Tan solo queremos eso, comprobar que funciona la iteración.
Mejora: accede al siguiente ejercicio