Saltar a contenido

Datapool

Usando Datapools, podrás gestionar eficientemente el procesamiento por lotes de elementos.

El Datapool puede considerarse un administrador de colas, lo que nos permite tener control y granularidad sobre los elementos que deben ser procesados.

En las siguientes secciones, encontrarás detalles sobre cómo funciona un Datapool y cómo utilizar esta funcionalidad en tus procesos de automatización.

Lista de Datapools

Crear un Datapool

Para crear un nuevo Datapool, haz clic en + Nuevo Datapool y completa los siguientes campos:

Nuevo Datapool

  • Etiqueta: El identificador único que se utilizará para acceder al Datapool.
  • Activo: Si está ACTIVO, el Datapool estará disponible para ser accedido y consumido.
  • Política de consumo: Puedes elegir entre dos políticas de consumo:
    • FIFO: El primer elemento agregado al Datapool será el primer elemento en ser procesado.
    • LIFO: El último elemento agregado al Datapool será el primer elemento en ser procesado.
  • Reintento automático: Si está habilitado, un elemento puede ser reprocesado automáticamente en caso de error.
    • Máximo de reintentos automáticos: El número máximo de intentos para que un elemento sea procesado exitosamente.
  • Abortar en caso de error: Si está habilitado, el Datapool se vuelve inactivo y ya no se consume en caso de errores consecutivos.
    • Máximo de errores antes de inactividad: Número máximo de elementos procesados consecutivamente con error que se tolerarán antes de que el Datapool se vuelva INACTIVO.
  • Tiempo máximo de procesamiento del elemento (Minutos): Tiempo esperado para que un elemento del Datapool sea procesado en condiciones normales.
  • Disparador: Puedes definir si el Datapool creado también será responsable de disparar nuevas tareas:
    • SIEMPRE: Cada vez que se agrega un nuevo elemento al Datapool, se creará una nueva tarea para un proceso de automatización dado.
    • NUNCA: El Datapool nunca será responsable de disparar tareas desde un proceso de automatización.
    • NINGUNA TAREA ACTIVA: Cada vez que se agrega un nuevo elemento, el Datapool disparará una nueva tarea de un proceso de automatización solo si no hay tareas de ese proceso en ejecución o pendientes.
  • Automatización predeterminada: El proceso de automatización que el Datapool utilizará para disparar nuevas tareas si se está utilizando algún disparador.
  • Esquema: Los campos que conformarán la estructura de un elemento del Datapool. Puedes agregar nuevos campos al esquema haciendo clic en +Agregar y definiendo una etiqueta y el tipo de dato esperado.

Agregar nuevos elementos al Datapool

Podemos agregar nuevos elementos al Datapool de dos formas diferentes.

Vista del Datapool

Agregar cada elemento manualmente

Al hacer clic en + Agregar entrada, podemos agregar un nuevo elemento al Datapool. Podemos completar cuál será la prioridad de este elemento específico y también los valores que este elemento recibirá.

Además de completar los valores definidos al crear el Esquema, también podemos agregar nuevos campos que contengan datos adicionales que formen parte de este elemento.

Al hacer clic en +Agregar dentro de la ventana de llenado del elemento, puedes incluir tantos campos adicionales como sean necesarios para ese elemento específico.

Agregar elemento al Datapool

Agregar elementos usando un archivo CSV

Además de agregar elementos manualmente, podemos agregar varios elementos simultáneamente a través de un archivo .csv.

Al seleccionar la opción Importar CSV, podemos descargar un archivo de ejemplo y completarlo con información sobre los elementos que se agregarán al Datapool.

Una vez hecho esto, sube el archivo y haz clic en Subir para cargar automáticamente los elementos.

Importar CSV al Datapool

Gestionar los elementos del Datapool

Para cada elemento agregado al Datapool, podemos ver la siguiente información:

Lista de elementos del Datapool

  • Id: El identificador único del elemento.
  • Prioridad: La prioridad establecida para el elemento.
  • Estado: El estado actual del elemento en el Datapool.
  • Creado en: La fecha en que se agregó el elemento al Datapool.
  • Tiempo de procesamiento: Tiempo transcurrido procesando el elemento.
  • Ciclo de vida: El tiempo transcurrido desde la creación del elemento en el Datapool hasta la finalización del procesamiento.

Al expandir los detalles de un elemento haciendo clic en +, podemos ver la siguiente información adicional:

Detalles del elemento del Datapool

  • Id de tarea: El identificador de la tarea responsable de acceder y consumir ese elemento del Datapool.
  • Usuario: El usuario responsable de agregar el elemento al Datapool.
  • Fecha de creación: La fecha en que se agregó el elemento al Datapool.
  • Fecha de inicio del procesamiento: La fecha en que se consumió el elemento para ser procesado.
  • Fecha de finalización: La fecha en que se completó el procesamiento del elemento.
  • Padre: El elemento padre del que se originó este elemento hijo. Esta información se mostrará en los casos en que un elemento se reprocese (reintentar) o cuando se reinicie el procesamiento de un elemento (reiniciar).
  • Hijo: El elemento hijo del que se originó este elemento. Esta información se mostrará en los casos en que un elemento se reprocese (reintentar) o cuando se reinicie el procesamiento de un elemento (reiniciar).
  • Prioridad: La prioridad establecida para el elemento.
  • Valores: Los conjuntos de clave/valor que conforman el elemento del Datapool. Podrás ver los campos predeterminados que se definieron a través del Esquema del Datapool y también agregar nuevos campos haciendo clic en +Agregar.

Además de ver la información de cada elemento, podemos realizar algunas operaciones accediendo al menú del elemento. Puedes Reiniciar un elemento que ya ha sido procesado y también Eliminar un elemento que aún está pendiente.

Importante

Al reiniciar o realizar un reprocesamiento automático, se creará un nuevo elemento en el Datapool.

Estas operaciones nunca se realizarán en el mismo elemento; en su lugar, se creará una "copia" de ese elemento en el Datapool que hará referencia al elemento original (propiedad Padre mencionada anteriormente).

Ver los estados de procesamiento de los elementos

Cuando se agrega un nuevo elemento al Datapool, inicialmente estará en estado PENDIENTE. Podemos entender los estados que un elemento puede asumir durante su ciclo de vida de la siguiente manera:

PENDIENTE: El elemento está esperando ser procesado; en este punto, estará disponible para ser accedido y consumido.

PROCESANDO: El elemento ha sido accedido para su ejecución y se encuentra en la fase de procesamiento.

COMPLETADO: Se ha completado el procesamiento del elemento de manera exitosa.

ERROR: Se ha completado el procesamiento del elemento con un error.

TIEMPO DE ESPERA: El procesamiento del elemento se encuentra en una fase de espera (esto puede ocurrir cuando el estado de finalización del elemento no se informa mediante código).

Informar el estado de un elemento

Advertencia

Para que los estados se actualicen en el Datapool, el estado de procesamiento de cada elemento (COMPLETADO o ERROR) debe informarse mediante código.

Si el estado de procesamiento del elemento no se informa mediante el código del robot, esto se considerará automáticamente por el Datapool como un estado de TIEMPO DE ESPERA para ese elemento.

En las siguientes secciones, entenderemos mejor cómo se puede informar el estado de un elemento mediante código.

Entendiendo el estado de TIEMPO DE ESPERA

El estado de TIEMPO DE ESPERA se basa en el tiempo que se definió en la propiedad Tiempo máximo de procesamiento del elemento (Minutos) al crear el Datapool.

Si el procesamiento de un elemento excede el tiempo máximo definido, ya sea debido a la falta de un informe que indique el estado del elemento o algún problema en la ejecución del proceso que impida que se realice el informe, el Datapool indicará automáticamente que el elemento ha entrado en un estado de TIEMPO DE ESPERA.

Esto no necesariamente significa un error, ya que un elemento aún puede pasar de un estado TIMEOUT a un estado DONE o ERROR.

Sin embargo, si el proceso no se recupera (en caso de posibles bloqueos) y el estado del elemento no se informa, Datapool considerará automáticamente el estado de ese elemento como ERROR después de un período de 24 horas.

Cómo usar Datapools con el SDK de Maestro

Puedes consumir y reportar fácilmente el estado de los elementos de un Datapool utilizando el SDK de Maestro en tu código de automatización.

Instalación

Si aún no tienes instalada la dependencia, simplemente sigue estas instrucciones:

pip install botcity-maestro-sdk

Important

Además de la instalación, recuerda incluir la dependencia en el archivo requirements.txt del bot.

Importar el SDK

Después de la instalación, importa la dependencia e instancia el SDK de Maestro:

# Import for integration with BotCity Maestro SDK
from botcity.maestro import *

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

# Instantiating the Maestro SDK
maestro = BotMaestroSDK.from_sys_args()
# Fetching the details of the current task being executed
execution = maestro.get_execution()

Procesamiento de elementos de Datapool

# Consuming the next available item and reporting the finishing state at the end
datapool = maestro.get_datapool(label="Items-To-Process")

while datapool.has_next():
    # Fetch the next Datapool item
    item = datapool.next(task_id=execution.task_id)
    if item is None:
        # Item could be None if another process consumed it before
        break

    # Processing item...

    item.report_done()

Tip

Para obtener el valor de un campo específico que se definió en el Esquema del elemento, puedes usar el método get_value() o pasar la etiqueta del campo entre [], utilizando la referencia del elemento.

item = datapool.next(task_id=execution.task_id)

data = item.get_value("data-label")
# or
data = item["data-label"]

Código completo

from botcity.core import DesktopBot
from botcity.maestro import *

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

def main():
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()

    bot = DesktopBot()
    # Implement here your logic...

    # Getting the Datapool reference
    datapool = maestro.get_datapool(label="Items-To-Process")

    while datapool.has_next():
        # Fetch the next Datapool item
        item = datapool.next(task_id=execution.task_id)

        if item is None:
            # Item could be None if another process consumed it before
            break

        # Getting the value of some specific field of the item
        item_data = item["data-label"]

        try:
            # Processing item...

            # Finishing as 'DONE' after processing
            item.report_done()

        except Exception:
            # Finishing item processing as 'ERROR'
            item.report_error()

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()

Tip

Observa las otras operaciones que podemos realizar con Datapools utilizando el SDK de Maestro de BotCity y la API de Maestro de BotCity.